[英]j2objc - exception when deserialize enum
我在反序列化包含枚舉的對象時遇到麻煩。 該對象進行序列化而不會產生投訴,但是反序列化該對象時會收到InvalidObjectException。 異常消息說“沒有枚舉常量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中生成的initialize方法如下所示:
+ (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自動在枚舉中填充字符串常量,而不是手工編碼?
感謝您的任何幫助,您可以提供。
我們可能通過最近的更改打破了這一點,該更改消除了多余的枚舉常量名稱字符串。 我們在枚舉的類初始值設定項及其元數據中都定義了名稱,此外,我們還提出了一個重要的要求,即停止在應用程序二進制文件中輕松發現枚舉常量(顯然,眾所周知,技術作家會轉儲早期訪問二進制文件並在其上運行字符串)獨家新聞)。 現在,常量名稱僅存在於元數據中(無冗余),並且如果使用--strip-reflection構建應用程序,則枚舉沒有元數據,並且該名稱成為枚舉類加上常量的序數。 但是,由於Google應用程序改用協議緩沖區 (速度更快且對版本的敏感性較低),因此序列化支持被忽略了。
感謝出色的測試用例,這將使它更易於修復。 如果您希望在修復此問題后得到通知,請提交錯誤 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.