支持无缝模型版本的 BinaryFormatter 替代方案?

BinaryFormatter alternative to support seamless model versions?

我喜欢BinaryFormatter,它是轻量级的(2行代码)。但我能感觉到它有一些并发症的风险。

特别是涉及不同的应用程序版本,模型略有不同(重命名/删除/移动属性/类 跨版本)。

最好的选择是什么?

考虑轻量级、低样板文件,但有一些选项可以在没有太多开销的情况下正确管理版本。

根据您的描述,您违反了向后兼容规则。在二进制序列化中处理这些情况即使不是不可能,也是很困难的。

Never remove a serialized field
Never change the name or type of a serialized field
When adding a new field, mark it with the OptionalField attribute

如果您想处理所有字段可以更改类型、名称、位置等的情况。您最好使用 Json 或 XML,其中第一个标记必须是版本并且它永远不会改变。然后你就会知道如何处理文件的其余部分。

你可以用二进制序列化做同样的事情,但不是以任何自动化的方式,你最终会得到如下代码:

readByte()
If ver 1 readInt()
If ver 2 readInt(), readString()
readArray()
If ver 4 readBool()
If ver 3 readDouble()

等如果你不想遵循上面关于版本容错的规则,二进制不应该是你的第一选择。