为什么BinaryFormatter不支持Version Tolerance?

时间:2015-02-11 18:56:42

标签: unity3d

根据.NET文档,Version Tolerance被添加到.NET 2.0中的BinaryFormatter: https://msdn.microsoft.com/en-us/magazine/cc163902.aspx#S10

所以理论上,我应该能够从Serialized类中删除一个字段,而不会让事情爆炸。即:

//Version 1
SaveData {
    public int Num1;
    public int Num2;
}

//Version 2
SaveData {
    public int Num1;
}

即使我删除了Num2,由于Version Tolerance,该类的旧版本仍然应该反序列化ok:"在删除未使用的成员变量的情况下,二进制格式化程序将忽略其他在流中找到的信息。 " https://msdn.microsoft.com/en-us/magazine/cc163902.aspx#S10

相反,Unity正在抛出一个错误: System.Runtime.Serialization.SerializationException:Field" Num2"在SaveData类中找不到

有没有办法在Unity中使用它?

[编辑]这是我用来保存/加载的代码:

//Save
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = File.Create(path);
bf.Serialize(fs, data);
fs.Close();

//Load
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream(path, FileMode.Open);
SaveData data = (SaveData)bf.Deserialize(fs);
fs.Close();

1 个答案:

答案 0 :(得分:0)

首先,BinaryFormatter 可能很奇怪(我自己不测试这个案例),因为Unity使用了一些奇怪版本的Mono而不是MS.NET。因此,.NET文档可能会说谎: - < (大多数时候,他们以同样的方式工作)

其次,我使用protobuf-net在我的Unity项目中执行数据操作。到目前为止,它就像一个魅力。