用于反序列化.NET中已更改的类的策略

Mat*_*att 6 .net c# serialization

我有这门课

[Serializable]
public class myClass() : ISerializable
{
    public int a;
    public int b;
    public int c;

    public void GetObjectData(SerializationInfo info, 
                              StreamingContext context)
        {
        // Some code
        }

    public myClass(SerializationInfo info, 
                   StreamingContext context)
        {
        // Some code
        }
}
Run Code Online (Sandbox Code Playgroud)

我的数据库中有数百个这样的对象.我现在准备发布我的应用程序的新版本,这个类已经变形了

[Serializable]
public class myClass() : ISerializable
{
    public int a;
    public string b;
    public int c;
    public bool d;

    public void GetObjectData(SerializationInfo info, 
                              StreamingContext context)
        {
        // Some code
        }

    public myClass(SerializationInfo info, 
                   StreamingContext context)
        {
        // Some code
        }
}
Run Code Online (Sandbox Code Playgroud)

如何使用第二个版本的反序列化构造函数对基于第一个版本序列化的对象进行反序列化.

是否还有未来版本校对我的第二版课程的策略?

das*_*ght 4

如果您没有做好准备,您可能需要采取一些技巧:当您的public myClass反序列化构造函数获取 的值时bool d,将代码括在try/中catch,然后设置d在捕获异常时设置为其默认值。

将来,添加一个int"__ver"(或任何其他不与您传递给的参数冲突的名称info.AddValue),并将其设置为您在类中维护的常量,以指示序列化中兼容和不兼容的更改:

public class myClass : ISerializable {
    private const int __ver = 4;
    public int a;
    public string b;
    public int c;
    public bool d;

    public void GetObjectData(SerializationInfo info, 
                          StreamingContext context) {
        info.AddValue("__ver", ver);
        info.AddValue("a", a);
        // and so on
    }

    public myClass(SerializationInfo info, 
               StreamingContext context) {
        switch(info.GetInt32("__ver")) {
            case 3: 
                // Deserialize prior version
            break;
            case 4: 
                // Deserialize current version
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)