.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 在 Wrapper 的 ctor 中为空。
在 Wrapper 的 ctor 之后 NVC 不为空,并且具有正确的值。
这里发生了什么?NameValueCollection 显然能够使用默认序列化反序列化自身,但为什么反序列化会延迟并且不会在 Wrapper 构造函数中的 GetValue() 调用中发生?