如果没有构造函数,序列化如何工作?

时间:2011-06-01 16:46:15

标签: .net serialization

我不确定这段代码是如何工作的。

    [Serializable]
    class Blah
    {
        public Blah(int value)
        {
            this.value = value;
        }

        public int value;
    }

        BinaryFormatter b = new BinaryFormatter();
        Blah blah = new Blah(4);
        MemoryStream s = new MemoryStream();
        b.Serialize(s, blah);
        s.Seek(0, SeekOrigin.Begin);
        blah = null;
        blah = (Blah)b.Deserialize(s);

因为我没有无参数构造函数,所以反序列化器可以创建一个新的Blah实例似乎很奇怪。

3 个答案:

答案 0 :(得分:5)

反序列化过程使用FormatterServices.GetUninitializedObject获取对象而不调用任何构造函数。

答案 1 :(得分:4)

序列化程序在反序列化对象时不会调用构造函数。字段的值直接设置。它不需要创建对象(通过new)它只是创建存储,填充它,并将其转换为Blah类型。

答案 2 :(得分:1)

BinaryFormatter使用名为FormatterServices.GetUninitializedObject的voodoo方法:

  

...对象初始化为零,没有构造函数运行