代码之家  ›  专栏  ›  技术社区  ›  Adam Lear

在反序列化NameValueCollection的过程中,幕后会发生什么?

  •  2
  • Adam Lear  · 技术社区  · 16 年前

    在.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在包装器的ctor中为空。

    这是怎么回事?NameValueCollection显然能够使用默认序列化对自身进行反序列化,但是 为什么反序列化会延迟,并且不会在包装器的构造函数中的GetValue()调用中发生?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Mikael Svenson    16 年前

    我试图在反序列化方法中挖掘一些内容,但没有找到它的具体实现方式。

    如果你让 MyClassWithNVC ISerializable 然后它运行自定义反序列化代码,并且MyClass.NVC在包装器反序列化器方法中不为NULL。

    因此,这不是特定的行为 NameValueCollection ,但任何自动序列化的属性。

    推荐文章