le-*_*ude 5 java polymorphism serialization msgpack
我正在玩MessagePack和Java.在序列化工具方面,我曾经有过使用Protobuf和Json(使用Jackson和Gson)的经验.
当涉及到正常的序列化和反序列化时,我完全没有问题.当我想要另一个类的多个子类出现问题时.
我用以下代码测试它:
TestMessage.TestMessageSubClass sub = new TestMessage.TestMessageSubClass(); byte [] pack = MsgPack.pack(sub); Assert.assertTrue(ArrayUtils.isNotEmpty(包));
List<? extends TestMessage> msg = MsgPack.unpack(pack, TestMessage.class);
Assert.assertNotNull(msg);
Assert.assertFalse(msg.isEmpty());
TestMessage temp = msg.get(0);
Assert.assertNotNull(temp);
Assert.assertTrue(temp instanceof TestMessage.TestMessageSubClass);
TestMessage.TestMessageSubClass sub2 = (TestMessage.TestMessageSubClass) temp;
Assert.assertEquals(sub, sub2);
System.out.println(sub);
System.out.println(sub2);
Run Code Online (Sandbox Code Playgroud)
这两行失败,因为当我反序列化时,我只得到一个普通的TestMessage,而不是一个TestMessageSubClass实例.
Assert.assertTrue(temp instanceof TestMessage.TestMessageSubClass);
TestMessage.TestMessageSubClass sub2 = (TestMessage.TestMessageSubClass) temp;
Run Code Online (Sandbox Code Playgroud)
我想这是因为默认情况下,MessagePack解包器无法确定他需要反序列化的确切类.事实上,如果我直接要求他反序列化为TestMessageSubClass,这将工作得很好.
我的要求是TestMessage可能有任意数量的具有额外数据的子类,并且使用相同的代码我需要在正确的类实例中对它们进行反序列化而不会丢失任何内容.我可能正在反序列化包含这些TestMessage实例的异构列表的流.
我可以在JacksonJson中使用@JsonSubTypes注释获得我想要的行为.
有没有办法使用官方的MessagePack客户端API并获得它?我自己有一种已知的模式吗?
这是我的MsgPack包装类的代码:GIST
任何有关更有效地使用MessagePack的建议也是受欢迎的.