j2objc - 反序列化枚举时的异常

时间:2017-11-14 03:49:37

标签: java serialization enums j2objc

我无法反序列化包含枚举的对象。该对象序列化没有抱怨,但是当我反序列化对象时,我得到一个InvalidObjectException。异常消息表明存在" No enum constant com.mypackagname。"

我已经通过基于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();
    }
}

我发现如果我在生成的Objective C代码中为枚举初始化添加字符串值,则反序列化工作正常。 Obj C中的结果初始化方法如下所示:

+ (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)
    }
}

请注意,我添加了@" MALE"和@" FEMALE",j2objc输出的默认值是@""。

我有两个问题。 (1)这是启用枚举的往返序列化/反序列化的正确方法吗? (2)如果是这样,有没有办法让j2objc自动填充枚举中的字符串常量而不是手工编写它们?

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

我们可能通过最近的更改消除了冗余的枚举常量名称字符串。我们在枚举的类初始值设定项和元数据中都定义了名称,此外我们还有一个重要的请求,即停止在app二进制文件中轻松发现枚举常量(显然技术编写者已经知道转储早期访问二进制文件并在其上运行字符串获得任何新功能的独家新闻)。现在常量名称仅在元数据中(没有冗余),如果应用程序使用--strip-reflection构建,则枚举没有元数据,名称变为枚举类加常量的序数。但是,由于Google应用使用protocol buffers代替(更快且版本更不敏感),因此忽略了序列化支持。

感谢优秀的测试用例,这将使其更容易修复。如果您希望在修复此问题时收到通知,请file a bug