自定义类型和序列化列表的问题

时间:2011-01-04 19:15:06

标签: c# serialization binary-serialization serializationbinder

我们正在努力发布我们的某个产品的2.0版本,并且我们希望保持与已安装的1.0版客户群的文件兼容性。我一直在我们的应用程序中的大多数类型上实现ISerializable,似乎遇到了障碍。

我有一个Type,为了讨论,我们称之为Family

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

这是1.0版本的版本,在2.0中我们将Name类更改为Person,实际上是相同的,但构造函数略有不同,显然名称不同。

[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>>
}

这显然不起作用,类型“名称”不再在程序集中,所以我添加了一个SerializationBinder来修复它:

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;
}

这很有用,当我反序列化obeject时,调用binder,返回正确的类型,但是Person上的Deserialization Constructor永远不会被调用。没有例外被抛出,任何人都有任何想法?

1 个答案:

答案 0 :(得分:0)

固定!有一种基本类型的Person无法完成它的构造函数,这导致人员构造函数永远不会被调用。