我目前正在尝试使用 Msgpack 使用 Msgpack 反序列化对象图,但我遇到了问题。
目前我有一个简单的层次结构,由两个类组成:BaseMessage
和PersonNew
. BaseMessage
有一个id
带有 getter 和 setter 的 Long 字段。PersonNew
具有字符串字段name
,email
并且继承自BaseMessage
.
最初PersonOld
类具有该id
字段,并且可以很好地序列化/反序列化。但是,当试图从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