現在、Msgpack を使用してオブジェクト グラフを逆シリアル化するために Msgpack を試していますが、問題が発生しています。
現時点では、 と の 2 つのクラスで構成される単純な階層がBaseMessage
ありPersonNew
ます。getter と setter を持つBaseMessage
単一の Long フィールドがあります。には String フィールドがあり、および から継承されます。id
PersonNew
name
email
BaseMessage
もともとPersonOld
クラスにはid
フィールドがあり、正常にシリアライズ/デシリアライズされていました。ただし、 from PersonOld
( を持っていたid
) からPersonNew
クラス ( id
fromを継承している) に逆シリアル化BaseMessage
しようとすると、エラーが発生します:
org.msgpack.MessageTypeException: Unexpected raw value
私が使用しているすべてのフィールドは非公開です。
以下はサンプルコードです。
PersonOld personOld = new PersonOld();
personOld.setName("person");
personOld.setEmail("person@email.com");
MessagePack msgpack = new MessagePack();
msgpack.register(PersonNew.class);
msgpack.register(PersonOld.class);
// Serialize using old person class
byte[] personBytes = msgpack.write(personOld);
ByteArrayInputStream in = new ByteArrayInputStream(personBytes);
Unpacker unpacker = msgpack.createUnpacker(in);
// Deserialize using new person class
PersonNew deserializePerson = unpacker.read(PersonNew.class);
新しいクラスに逆シリアル化したい理由は、古いシリアル化されたデータ (たとえば、永続化されたメッセージ キュー内) を新しいクラス (たとえば、クラスの更新の場合) と互換性を持たせることができるかどうかを確認したいからです。クラスの@Optional
注釈を使用しようとしましたが、まだ機能しません。id
BaseMessage
同じフィールドを持っているにもかかわらず、別のクラスで逆シリアル化することはまったく可能ですか?
よろしく、
SNK