【问题标题】:What happens behind the scenes during deserialization of a NameValueCollection?在 NameValueCollection 的反序列化过程中,幕后会发生什么?
【发布时间】:2010-02-22 18:21:54
【问题描述】:

.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 中为空。

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

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

【问题讨论】:

    标签: c# .net serialization namevaluecollection


    【解决方案1】:

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

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

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

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

    【讨论】:

    • @Mikael:感谢您的回复。这似乎仍然很奇怪。为什么在 GetValue() 调用期间不处理这两种序列化?我也无法用另一个类重现相同的行为,但我会继续尝试。
    • 啊,想通了。关键是 NameValueCollection 实现的 IDeserializableCallback。所以这个问题可以用任何做同样事情的集合(或对象)来重现。更多详情请点击此处:msdn.microsoft.com/en-us/library/ms973893.aspx
    • 如果我们足够近地阅读 MSDN 文档,它似乎拥有一切:) 感谢您链接到该页面。我也比较聪明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多