我们正在研究发布其中一种产品的2.0版,我们希望维护与1.0版客户的安装基础的文件兼容性。我一直在应用程序中的大多数类型上实现偶然化,并且似乎已经遇到了障碍。

我有一种类型,为了讨论而将其称为家庭

[Serializable]
public class Family : 
    IDisposable,
    INotifyPropertyChanged
{
    private string m_Address;
    //....
    private List<Name> m_People;
    //...
}

这就是以1.0版本发货的方式,在2.0中,我们将名称类更改为一个人,这实际上是相同的,但具有略有不同的构造函数,显然是一个不同的名称。

[Serializable]
public class Family : 
    IDisposable,
    INotifyPropertyChanged,
    ISerializabe
{
    private string m_Address;
    //....
    private List<Person> m_People;
    //...

    private Family(SerializationInfo info, StreamingContext context)
    {
        m_Address = info.GetString("m_Address");
        m_People = (List<Person>)info.GetValue("m_People", typeof(List<Person>));
    }

    // <<GetObjectData Method>>
}

这显然不起作用,类型的“名称”不再在程序集中,因此我添加了一个序列化binder来解决该问题:

public sealed NamePersonSerializationBinder : SerializationBinder
{
    if (typeName.StartsWith("System.Collections.Generic.List`1[[Company.Name"))
        return typeof(List<Person>);
    else if (typeName.StartsWith("Company.Name"))
        return typeof(Person);
    else
        return null;
}

这主要是有效的,当我应对遵守的序列化时,粘合剂被称为正确的类型,但是对人的构造构建器永远不会被调用。没有例外,有人有任何想法吗?

有帮助吗?

解决方案

固定的!有一种基本类型的人未能完成其构造函数,这导致人们的构造函数从未被召唤。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top