在反序列化NameValueCollection期间幕后会发生什么?

时间:2010-02-22 18:21:55

标签: c# .net serialization namevaluecollection

.NET(de)序列化的幕后工作是什么让它在下面的场景中表现得像? (这是一个测试应用程序,只是说明了我的设置。)

我有一个具有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();
    }
}

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

  

在Wrapper的ctor中,NVC是空的。

     

在Wrapper的ctor之后,NVC不为空,并且具有正确的值。

这里发生了什么? NameValueCollection显然能够使用默认序列化反序列化自身,但是 为什么反序列化延迟而不是在Wrapper的构造函数中的GetValue()调用中发生?

1 个答案:

答案 0 :(得分:2)

我试图在Deserialize方法中挖掘一下,但没有找到它的确切实现方式。

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

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

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