簡體   English   中英

j2objc-反序列化枚舉時的異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM