gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:50:11 26 4
gpt4 key购买 nike

在 .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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com