如何反序列化类型被修改为抽象类的二进制格式对象?



我们的应用程序使用事件溯源。早些时候,我们有一个名为 PropertyUpdate 的事件,它是由聚合引发的。这已被序列化并存储在我们的事件存储中。现在,此类的架构已更改,并且该事件已作为抽象类进行。我们现在有更具体的派生类,如 TemplatePropertyUpdate、SystemPropertyUpdated 等。

如您所见,如果我加载较旧的聚合事件并尝试冻结状态,则在反序列化期间会出现错误。我正在开发一种工具来加载旧事件并根据最新更改升级它们。我们使用 BinaryFormatter 进行序列化和反序列化。较旧的(非抽象(事件现在在反序列化期间给出"无法创建抽象类"异常。

从此旧事件创建动态对象以便派生较新版本的最佳方法是什么?

我处理这样的事情的首选方法是有一个序列化层。所有对象都将转换为相应的序列化对象,然后再次转换回来。

如果对象层次结构中有重大更改,则可以将序列化对象重命名为 MyObjectLegacy 或 MyObject_v0 。然后,转换代码可以将旧的序列化对象转换为要使用的任何新对象。这有助于将序列化与对象模型的其余部分分开。

如果您缺少序列化层,除了保留旧类以便您可以解压缩它之外,我看不到其他选择。您可能可以使用绑定重定向或其他东西来重命名类,但根据我的经验,这有点脆弱。

我鼓励你切换到BinaryFormatter以外的其他东西。它缓慢、脆弱,并且生成相对较大的文件。有更好的选择,如 protobuf.Net,Bson,json等。看一个比较。当BinaryFormatter在不同的.Net版本之间更改格式时,我们遇到了一些问题,这并不好玩。

最新更新