5

我正在玩 MessagePack 和 Java。在序列化工具方面,我过去曾使用过 Protobuf 和 Json(使用 Jackson 和 Gson)。

当涉及到正常的序列化和反序列化时,我完全没有问题。当我想拥有另一个类的多个子类时,就会出现问题。

我正在使用以下代码对此进行测试:

TestMessage.TestMessageSubClass sub = new TestMessage.TestMessageSubClass(); 字节[] 包 = MsgPack.pack(sub); Assert.assertTrue(ArrayUtils.isNotEmpty(pack));

    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);

这两行失败是因为当我反序列化时,我只得到一个普通的 TestMessage,而不是一个 TestMessageSubClass 实例。

    Assert.assertTrue(temp instanceof TestMessage.TestMessageSubClass);
    TestMessage.TestMessageSubClass sub2 = (TestMessage.TestMessageSubClass) temp;

我想这是因为默认情况下 MessagePack 解包器无法确定他需要反序列化的确切类。事实上,如果我直接要求他反序列化为 TestMessageSubClass,这将工作得很好。

我的要求是 TestMessage 可能有任意数量的带有额外数据的子类,并且使用相同的代码我需要在正确的类实例中反序列化它们而不会丢失任何东西。我可能正在反序列化包含这些 TestMessage 实例的异构列表的流。

我可以使用 JacksonJson 中的@JsonSubTypes 注释来获得我想要的行为。

有没有办法使用官方的 MessagePack 客户端 API 并获得它?我自己有一个已知的模式吗?

这是我的 MsgPack 包装类的代码:GIST

也欢迎任何有关更有效地使用 MessagePack 的建议。

4

0 回答 0