我只是意识到了一些疯狂的事情,我认为这是完全不可能的:当对象进行挑选时, datacontractserializer不调用构造函数 !

以此为例,例如:

[DataContract]
public class Book
{
    public Book()
    { // breakpoint here
    }

    [DataMember(Order = 0)]
    public string Title { get; set; }
    [DataMember(Order = 1)]
    public string Author { get; set; }
    [DataMember(Order = 2)]
    public string Summary { get; set; }
}

当我对该类的对象进行挑选时,断点不会受到命中。我绝对不知道这是怎么可能的,因为它是该对象的唯一构造函数!

我以为可能是由编译器生成的额外构造函数,因为 DataContract 属性,但我无法通过反思找到它...

因此,我想知道的是:如何在不称为构造函数的情况下创建我的班级实例?

注意:我知道我可以使用 OnDeserializing 属性可以在避免序列化开始时初始化我的对象,这不是我问题的主题。

有帮助吗?

解决方案

DataContractSerializer (喜欢 BinaryFormatter)不使用 任何 构造函数。它将对象创建为空内存。

例如:

    Type type = typeof(Customer);
    object obj = System.Runtime.Serialization.
        FormatterServices.GetUninitializedObject(type);

假设是避难所过程(或必要时回电)将完全初始化它。

其他提示

没有这种行为,有些情况是不可能的。考虑以下内容:

1)您的对象具有一个将新实例设置为“初始化”状态的构造函数。然后在该实例中调用了一些方法,将其带入“处理”状态。您不想创建具有“处理过”状态的新对象,但是您仍然希望de serialize / queperialize实例化。

2)您创建了一个具有私有构造函数和一些静态属性的类,以控制一组允许的构造函数参数。现在,您仍然可以序列化 /应对它们进行序列化。

XMLSerializer具有您预期的行为。我在XMLSerializer上遇到了一些问题,因为它确实需要默认的构造函数。与此相关的是,有时拥有私有财产设置器是有意义的。但是XMLSerializer还需要公共Getter和setter属性,以便序列化 /进行序列化。

我想到的是数据合同器 /二进制形式的行为,例如暂停实例的状态,并在测试过程中恢复。换句话说,这些实例不是“构造”的,而是“恢复”到较早的状态。

正如您已经提到的那样,[无序列化]属性使得将非序列化数据保持在同步中成为可能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top