将Byte[]转换为xml



我使用Axon2.4.6。我有一个Saga,其有效载荷使用XStreamSerializer序列化为二进制。

故事是这样的:

public class MySaga extends AbstractAnnotatedSaga {
...
private MyEvent myEvent;
...
}

包含一个事件,该事件是相关聚合对象的初始化事件。

现在我有一个反序列化问题,因为我通过添加一个属性来改变MyEvent。我通过添加反序列化器期望的serialize id找到了一个解决方法,但是这个解决方案可能不是最好的,因为我现在使用的是生产数据,如果我能够以某种方式上推传奇就更好了。

所以我打算做的是创建一个扩展JavaSerializer和调整SerializedObject<S>的自定义序列化器。问题是SerializedObject是十六进制/二进制的,所以我需要一种方法将其转换为org.dom4j对象,例如,这样我就可以添加缺失的属性,然后能够将其反序列化到MySaga中。

我尝试了几种方法,如

ByteArrayInputStream bos = new ByteArrayInputStream((byte [])serializedObject.getData());

new XStream();

但是它们都是从二进制表示直接到对象反序列化,我需要的是首先获得dom4j甚至xml转换。我不知道该怎么做。

我不得不说,我没有Axon 2的经验,但让我试着帮助你。

我可以在文档中找到,Axon提供了一个如何使用正确的2.4文档链接编写upcaster的示例。

根据你的问题,我不清楚的是,你是否使用JavaSerializerXStreamSerializer(或JacksonSerializer使其完整)。

在使用XML的情况下,文档将为您提供一个升级器的示例。值得一提(并检查)的是,您还可以查看xStream.ignoreUnknownElements(),这将使您的序列化器变得宽松,这意味着它在试图反序列化包含它不知道的属性的东西时不会失败(我想说非常有用)。

如果你使用的是JSON,你也有FAIL_ON_UNKNOWN_PROPERTIES的"特性"。在这种情况下,可以禁用该选项以使其更宽松。

如果你问我的话,让你的序列化器宽松似乎是正确的路线。如果你真的需要在新字段中添加一个默认/派生值,那么upcaster路由是你应该选择的。

KR,


编辑1:由Steven给出的评论触发,这导致我添加了这个编辑,并问你你期望这个Saga活多久。现在我注意到事件是你的传奇的一部分,我宁愿写一个新的传奇,不包含事件作为它的一部分,而只是字段不耦合到任何特定的事件。

最新更新