2017-11-14 6 views
0

列挙型を含むオブジェクトを逆シリアル化するのに問題があります。オブジェクトは不平をつけずにシリアル化されますが、オブジェクトを逆シリアル化するとInvalidObjectExceptionが発生します。例外メッセージには、「No enum constant com.mypackagname」と表示されています。j2objc - enumを逆シリアル化するときの例外

私は、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でメソッドを初期化したことは、このようになります:私は@「MALE」と「女性」@を追加

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

注意、j2objc出力からのデフォルトは「@」です。

私には2つの質問があります。 (1)enumの巡回逐次化/直列化解除を有効にする正しい方法ですか? (2)そうであれば、j2objcに手作業でコーディングするのではなく、列挙型の文字列定数を自動的に取り込む方法がありますか?

ご協力いただきありがとうございます。

答えて

0

おそらく、冗長な列挙定数名文字列を排除した最近の変更でこれを破ったでしょう。列挙型のクラス初期化子とメタデータの両方で定義された名前と、アプリケーションバイナリで簡単に見つかる列挙型定数の作成を中止するという重要な要求がありました(技術ライターは早期のアクセスバイナリをダンプし、新機能をすべて手に入れてください)。定数名はメタデータにのみあり(冗長性なし)、アプリケーションが--strip-reflectionでビルドされている場合、enumにはメタデータはなく、その名前はenumクラスと定数の序数になります。しかし、Googleアプリケーションでは代わりにprotocol buffersが使用されているため、シリアライゼーションのサポートは見落とされていました(より速く、バージョンに敏感ではありません)。

優れたテストケースをお寄せいただき、ありがとうございました。これが修正されたときに通知を受けたい場合は、file a bugを入力してください。

+0

あなたの説明をありがとう。私は、プロトコルバッファを調べて、修正を目の当たりにするようにします。 – mkeller

関連する問題