c# - 在反序列化 NameValueCollection 的过程中幕后发生了什么?

标签 c# .net serialization namevaluecollection

在 .NET(反)序列化的幕后发生了什么,使它的行为方式与它在以下场景中的行为方式相同? (这是一个测试应用程序,仅用于说明我的设置。)

我有一个带有 NameValueCollection 属性的类:

[Serializable]
public class MyClassWithNVC
{
    public NameValueCollection NVC { get; set; }
}

它又包含在另一个类中:

[Serializable]
class Wrapper : ISerializable
{
    public MyClassWithNVC MyClass { get; private set; }

    public Wrapper()
    {
        MyClass = new MyClassWithNVC
                      {
                          NVC = new NameValueCollection
                                    {
                                        {"TestKey", "TestValue"}
                                    }
                      };
    }

    public Wrapper(SerializationInfo info, StreamingContext context)
    {
        MyClass = info.GetValue("MyClass", typeof(MyClassWithNVC)) as MyClassWithNVC;

        if(MyClass.NVC == null)
        {
            Console.WriteLine("NVC is null inside Wrapper's ctor.");
        }
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("MyClass", MyClass);
    }
}

我的测试程序如下:

class Program
{
    static void Main(string[] args)
    {
        using(MemoryStream ms = new MemoryStream())
        {
            Wrapper wrapper = new Wrapper();
            new BinaryFormatter().Serialize(ms, wrapper);

            ms.Seek(0, SeekOrigin.Begin);

            Wrapper loaded = new BinaryFormatter().Deserialize(ms) as Wrapper;
            if(loaded.MyClass.NVC.Count == 1 && loaded.MyClass.NVC[0] == "TestValue")
            {
                Console.WriteLine("NVC is not null after Wrapper's ctor and has the correct value.");
            }
        }

        Console.ReadKey();
    }
}

当我运行它时,我在控制台中看到打印出以下内容:

NVC is null inside Wrapper's ctor.

NVC is not null after Wrapper's ctor and has the correct value.

这是怎么回事? NameValueCollection 显然能够使用默认序列化对自身进行反序列化,但是 为什么反序列化会延迟并且不会在 Wrapper 的构造函数中调用 GetValue() 时发生?

最佳答案

我试图深入研究 Deserialize 方法,但没有弄清楚它是如何实现的。

它似乎将首先运行 ISerializable 代码实现。所有自定义代码完成后,它将反序列化所有自动序列化的对象(如示例中的 MyClassWithNVC 类)。

如果您让 MyClassWithNVC 继承自 ISerializable,那么它会运行您自定义的反序列化代码,并且 MyClass.NVC 在 Wrapper 反序列化器方法中不为 NULL。

所以它不是 NameValueCollection 的特定行为,而是自动序列化的任何属性。

关于c# - 在反序列化 NameValueCollection 的过程中幕后发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2313086/

相关文章:

c# - 音频采样率计时

c# - 如何通过 WEB API 返回具有字节数组属性的对象?

c# - 带有 Masstransit 发布的中间件

c# - 如何通过 WMI 获取我系统上的所有智能卡读卡器?

python - 没有 ORM、DOM 或表单的对象模式/模型

c# - 从框架控件继承时,我应该调用基本构造函数吗?

.net - 如何在 JSON .NET 上对属性名称强制使用引号

.net - Win32异常 :The target principal name is incorrect when calling a WCF service with WebClient

java - 动态添加fasterxml注解?

serialization - 流利的Nhibernate实体序列化错误列表