【问题标题】:Problem with Lists of custom type and Serialization自定义类型和序列化列表的问题
【发布时间】:2011-01-04 19:15:05
【问题描述】:

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

我有一个类型,为了讨论,我们称它为 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;
}

这主要是有效的,当我反序列化对象时,绑定器被调用,返回正确的类型,但 Person 上的反序列化构造函数永远不会被调用。没有抛出异常,有人有什么想法吗?

【问题讨论】:

    标签: c# serialization binary-serialization serializationbinder


    【解决方案1】:

    已修复!有一个基本类型的 Person 未能完成它的构造函数,这导致 person 构造函数永远不会被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2012-06-07
      • 1970-01-01
      • 2019-02-03
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多