2017-11-14 9 views
0

열거 형을 포함하는 객체를 직렬화 해제하는 데 문제가 있습니다. 객체는 불만없이 직렬화되지만 객체를 직렬화 해제 할 때 InvalidObjectException이 발생합니다. 예외 메시지에 "No enum constant com.mypackagname"이 있습니다.j2objc - enum을 deserialize 할 때 예외

나는 SerializationTest.java의 testSerialization() 메소드를 기반으로 몇 가지 테스트 코드를 작성하여 문제를 격리하고 재현했다.

public class SerializationTest { 
    private static final String TEST_FILE_NAME = "serialization-test.bin"; 
    public enum Gender { MALE, FEMALE } 

    public void testEnumSerialization() throws IOException, ClassNotFoundException { 
     Gender gender = Gender.MALE; 

     // Save the enum to a file. 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(TEST_FILE_NAME)); 
     out.writeObject(gender); 
     out.close(); 

     // Read back the enum. 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream(TEST_FILE_NAME)); 
     Gender gender2 = (Gender) in.readObject(); 
     in.close(); 
    } 
} 

내가 생성 된 목표 C 코드에서 열거 초기화에 문자열 값을 추가하면 직렬화가 잘 작동 것을 발견했다. 를 Obj C의 초기화 결과 방법은 다음과 같습니다 : 나는 @ "MALE"와 @있는 "여성"을 j2objc 출력의 기본입니다 @ ""추가

+ (void)initialize { 
    if (self == [SerializationTest_Gender class]) { 
     JreEnum(SerializationTest_Gender, MALE) = new_SerializationTest_Gender_initWithNSString_withInt_(@"MALE", 0); 
     JreEnum(SerializationTest_Gender, FEMALE) = new_SerializationTest_Gender_initWithNSString_withInt_(@"FEMALE", 1); 
     J2OBJC_SET_INITIALIZED(SerializationTest_Gender) 
    } 
} 

참고.

두 가지 질문이 있습니다. (1) 이것이 enum의 왕복 직렬화/직렬화 해제를 가능하게하는 올바른 방법입니까? (2) 그렇다면 j2objc가 열거 형의 문자열 상수를 손으로 코딩하는 대신 자동으로 채울 수있는 방법이 있습니까?

도움을 주셔서 감사합니다.

답변

0

중복 된 열거 형 상수 이름 문자열을 제거한 최근 변경으로이 문제가 발생했을 수 있습니다. 열거 형의 클래스 이니셜 라이저와 메타 데이터 둘 다에 정의 된 이름이 있었고, 앱 바이너리에서 쉽게 발견되는 열거 형 상수를 만드는 것을 중지하라는 중요한 요청이있었습니다. (분명히 기술 저자는 초기 액세스 바이너리를 덤프하고 새로운 기능에 대한 정보를 얻을 수 있습니다.) 이제 상수 이름은 메타 데이터에만 있습니다 (중복 없음). 앱이 --strip-reflection을 사용하여 빌드하면 enum에는 메타 데이터가 없으며 이름은 enum 클래스와 상수의 서수가됩니다. 그러나 Google 응용 프로그램이 protocol buffers을 대신 사용하기 때문에 직렬화 지원이 간과되었습니다 (더 빠르고 덜 버전 중심).

우수한 테스트 케이스 덕분에 문제를 쉽게 해결할 수 있습니다. 이 문제가 해결 될 때 알림을 받으려면 file a bug을 알려주십시오.

+0

설명해 주셔서 감사합니다. 대안으로 프로토콜 버퍼를 살펴보고 수정 사항을주의 깊게 살펴 보겠습니다. – mkeller