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

C# 支持无缝模型版本的BinaryFormatter替代方案?,c#,unity3d,serialization,persistence,binaryformatter,C#,Unity3d,Serialization,Persistence,Binaryformatter,我喜欢BinaryFormatter,它是轻量级的(2行代码)。但我能感觉到它有一些并发症的风险 特别是当涉及到不同的应用程序版本时,模型略有不同(重命名/删除/跨版本移动属性/类) 最佳选择是什么? 考虑到轻量级、低模板,但有一些选项可以正确管理版本,而不会产生太多开销。根据您的描述,您违反了向后兼容的规则。以二进制序列化的方式处理这些情况即使不是不可能,也是很困难的 Never remove a serialized field Never change the name or type o

我喜欢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
如果您想处理sun下的每一个案例,其中字段可以更改类型、名称、位置等。您最好使用Json或XML,其中第一个标记必须是版本,并且永远不会更改。然后您将知道如何处理文件的其余部分

您可以对二进制序列化执行相同的操作,但不能以任何自动方式执行,最终将得到如下代码:

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

等等。如果你不想遵循上述关于版本公差的规则,二进制不应该是你的首选。

看来我可以接受,但仍然不清楚我是否需要提前做一些事情。听起来像是可以进行重命名,因为:我将[OptionalField]添加到新字段,但如果反序列化Foremar版本,我在哪里可以将值设置为optionField?当类的要求随着时间的变化而改变时,人们不是在重命名东西吗?这怎么会是一个问题呢?无论如何,我想我可以设置一个类,在其中我只需将类与版本号匹配,然后安全地将它们序列化/缝合在一起。@Geri,如果您使用的是二进制序列化程序,并且您想完全控制它,并且能够随心所欲地添加/删除,然后,您需要编写所有手动序列化代码,这些代码非常容易出错,并且与上面的代码类似。老实说,对于您的应用程序,最好使用json或xml。