可ISerializable和向后兼容性

pie*_*sch 6 .net backwards-compatibility binaryformatter iserializable

我必须使用一个旧的应用程序,它使用binaryFormatter将应用程序数据序列化到文件流中(例如在一个名为"data.oldformat"的文件中),而没有任何优化主类已经标记了属性

<serializable()>public MainClass
....... 
end class
Run Code Online (Sandbox Code Playgroud)

和序列化代码

dim b as new binaryformatter
b.serialize(mystream,mymainclass)
Run Code Online (Sandbox Code Playgroud)

为了优化序列化/反序列化过程,我简单地使类实现了ISerializable接口并编写了一些优化的序列化例程

<serializable()>public MainClass
       implements ISerializable
....... 
end class
Run Code Online (Sandbox Code Playgroud)

优化工作非常好但我必须找到一种方法来恢复旧文件中的数据以实现向后兼容.

我怎样才能做到这一点??

皮耶路易吉

Jar*_*ore 4

stmax有一个很好的答案,但是我会像这样实现它,它使用SerializationEntry.GetEnumerator()而不是try/catch. 这种方式更加干净并且速度明显更快。

public MainClass(SerializationInfo info, StreamingContext context) {
    int version = 0;
    foreach (SerializationEntry s in info)
    {
        if (s.Name == "version") 
        {
            version = (int)s.Value;
            break;
        }
    }

    switch (version) {
      case 0:
        // deserialize "old format"
        break;
      case 1:
        // deserialize "new format, version 1"
        break;
      default:
        throw new NotSupportedException("version " + version + " is not supported.");
    }
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用 .FirstOrDefault() 的 LINQ 版本,但 SerializationInfo 没有实现 IEnumerable - 表面上,奇怪的是,它甚至没有实现旧的 IEnumerable 接口。