.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()调用中发生?
答案 0 :(得分:2)
我试图在Deserialize方法中挖掘一下,但没有找到它的确切实现方式。
它似乎将首先运行ISerializable代码实现。一旦所有自定义代码完成,它将反序列化所有自动序列化的对象(如示例中的MyClassWithNVC类)。
如果让MyClassWithNVC
继承自ISerializable
,那么它会运行您的自定义反序列化代码,并且Wrapper反序列化器方法中的MyClass.NVC不为NULL。
所以它不是NameValueCollection
的特定行为,而是任何自动序列化的属性。