我使用Axon
2.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的示例。
根据你的问题,我不清楚的是,你是否使用JavaSerializer
或XStreamSerializer
(或JacksonSerializer
使其完整)。
在使用XML
的情况下,文档将为您提供一个升级器的示例。值得一提(并检查)的是,您还可以查看xStream.ignoreUnknownElements()
,这将使您的序列化器变得宽松,这意味着它在试图反序列化包含它不知道的属性的东西时不会失败(我想说非常有用)。
如果你使用的是JSON
,你也有FAIL_ON_UNKNOWN_PROPERTIES
的"特性"。在这种情况下,可以禁用该选项以使其更宽松。
如果你问我的话,让你的序列化器宽松似乎是正确的路线。如果你真的需要在新字段中添加一个默认/派生值,那么upcaster路由是你应该选择的。
KR,
编辑1:由Steven给出的评论触发,这导致我添加了这个编辑,并问你你期望这个Saga活多久。现在我注意到事件是你的传奇的一部分,我宁愿写一个新的传奇,不包含事件作为它的一部分,而只是字段不耦合到任何特定的事件。