列挙型を含むオブジェクトを逆シリアル化するのに問題があります。オブジェクトは不平をつけずにシリアル化されますが、オブジェクトを逆シリアル化すると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に手作業でコーディングするのではなく、列挙型の文字列定数を自動的に取り込む方法がありますか?
ご協力いただきありがとうございます。
あなたの説明をありがとう。私は、プロトコルバッファを調べて、修正を目の当たりにするようにします。 – mkeller