2

現在、Msgpack を使用してオブジェクト グラフを逆シリアル化するために Msgpack を試していますが、問題が発生しています。

現時点では、 と の 2 つのクラスで構成される単純な階層がBaseMessageありPersonNewます。getter と setter を持つBaseMessage単一の Long フィールドがあります。には String フィールドがあり、および から継承されます。idPersonNewnameemailBaseMessage

もともとPersonOldクラスにはidフィールドがあり、正常にシリアライズ/デシリアライズされていました。ただし、 from PersonOld( を持っていたid) からPersonNewクラス ( idfromを継承している) に逆シリアル化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注釈を使用しようとしましたが、まだ機能しません。idBaseMessage

同じフィールドを持っているにもかかわらず、別のクラスで逆シリアル化することはまったく可能ですか?

よろしく、

SNK

4

0 に答える 0