如何在C#中覆盖反序列化

5
我有一个类,将在一段时间内进行某些版本更改。 这个类的数据会作为应用程序启动的一部分进行序列化和反序列化。我的问题是,如果我通过添加更多属性来更新这个类,然后启动应用程序,旧数据就无法正确加载。 我希望覆盖反序列化步骤,手动从XML重构对象是可以接受的,因为我存储了一个版本号,并可以使用它来递归更新对象的版本。 是否有我可以实现的接口或者可以设置的属性来实现这个功能? 如果您想不到实现我想要的方法,是否有替代方案?例如针对可能不存在于我正在加载的XML版本中的属性设置默认值。
4个回答


2

通常情况下,为了进行版本控制,您可以使用OptionalField属性来标记新添加的成员,这些成员可能会导致兼容性问题。在序列化期间,如果成员未被序列化,这将使成员的值为空而不是抛出异常。

此外,请查看IDeserializationCallback.OnDeserialization接口,它允许您自定义反序列化过程。


1

0

您可以实现ISerializable接口,并提供一个构造函数,该构造函数接受SerializationInfoStreamingContext对象,以获得对序列化/反序列化过程的精细控制。

例如:

[Serializable]
public struct MyStruct: ISerializable
{
    private readonly int _x;
    private readonly int _y;

    // normal constructor
    public MyStruct(int x, int y) : this()
    {
        _x = x;
        _y = y;
    }

    // this constructor is used for deserialization
    public MyStruct(SerializationInfo info, StreamingContext text) : this()
    {
        _x = info.GetInt32("X");
        _y = info.GetInt32("Y");
    }

    public int X { get { return _x; } }
    public int Y { get { return _y; } }

    // this method is called during serialization
    [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("X", X);
        info.AddValue("Z", Y);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接