j2objc - 反序列化枚举时出现异常
j2objc - exception when deserialize enum
我在反序列化包含枚举的对象时遇到问题。该对象毫无怨言地序列化,但是当我反序列化该对象时,我得到一个 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) 这是启用枚举往返 serialization/deserialization 的正确方法吗? (2) 如果是这样,有没有办法让 j2objc 自动填充枚举中的字符串常量而不是手动编码?
感谢您提供的任何帮助。
我们可能通过最近的更改消除了冗余枚举常量名称字符串来打破这一点。我们在枚举的 class 初始值设定项及其元数据中都定义了名称,此外,我们有一个重要的请求,要求停止在应用程序二进制文件中轻松发现枚举常量(显然,技术作家已经知道转储早期访问二进制文件和 运行 上的字符串以获得任何新功能的独家新闻)。现在常量名称仅在元数据中(无冗余),如果应用程序使用 --strip-reflection 构建,则枚举没有元数据并且名称变为枚举 class 加上常量的序号。但是,序列化支持被忽略了,因为 Google 应用程序使用 protocol buffers(速度更快,版本敏感度更低)。
感谢您提供出色的测试用例,这将使修复更容易。如果您希望在修复此问题时收到通知,请file a bug。
我在反序列化包含枚举的对象时遇到问题。该对象毫无怨言地序列化,但是当我反序列化该对象时,我得到一个 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) 这是启用枚举往返 serialization/deserialization 的正确方法吗? (2) 如果是这样,有没有办法让 j2objc 自动填充枚举中的字符串常量而不是手动编码?
感谢您提供的任何帮助。
我们可能通过最近的更改消除了冗余枚举常量名称字符串来打破这一点。我们在枚举的 class 初始值设定项及其元数据中都定义了名称,此外,我们有一个重要的请求,要求停止在应用程序二进制文件中轻松发现枚举常量(显然,技术作家已经知道转储早期访问二进制文件和 运行 上的字符串以获得任何新功能的独家新闻)。现在常量名称仅在元数据中(无冗余),如果应用程序使用 --strip-reflection 构建,则枚举没有元数据并且名称变为枚举 class 加上常量的序号。但是,序列化支持被忽略了,因为 Google 应用程序使用 protocol buffers(速度更快,版本敏感度更低)。
感谢您提供出色的测试用例,这将使修复更容易。如果您希望在修复此问题时收到通知,请file a bug。