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

标签 c# serialization binary-serialization serializationbinder

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

我有一个类型,为了讨论起见,我们称它为家庭

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

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

最佳答案

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

关于c# - 自定义类型和序列化列表的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4597435/

相关文章:

c# - 首先使用 Winforms 和 EF 4.1 代码进行数据绑定(bind)

c# - 如何检查目录 1 是否是 dir2 的子目录,反之亦然

大对象的 C# UDP 对象二进制序列化

ruby - 在 Ruby 中使用 Marshal::dump 进行对象序列化时如何写入文件

java - 在Android中序列化或保存PolylineOptions

c# - 为什么 C++ msgpack-c 在数字 10 (0x0A) 之前添加数字 13 (0x0D),而 C# MessagePack-CSharp 没有?

c# - 将数据从 jQuery POST/GET 到 MVC 4 Controller 并返回 View 的最佳方法

c# - 从 ASP.Net 调用异步函数

json - JSON响应的反序列化在字符串中保留引号

java - 通过序列化恢复单个实例