为什么在WCF反序列化器初始化对象时不调用我的抽象基类的构造函数?

时间:2009-08-26 10:19:31

标签: c# wcf serialization

标题中的问题......简而言之 - 我有一个WCF服务公开返回实体类的操作。客户端类继承自抽象基类而不是默认的System.Object。抽象基类定义了默认构造函数。当调用其中一个服务方法时,我希望在datacontract序列化器实现返回的对象时调用构造函数。但是,不会调用构造函数。另一方面,如果我自己创建实体类的实例,则调用抽象类构造函数。

为什么,为什么,并且有解决方法吗?或者我错过了什么 - 是否有另一个构造函数签名由datacontract序列化程序在实现对象时调用?如果没有,datacontract序列化程序如何在不调用构造函数的情况下实现对象,就像“new SomeClass()”调用一样?或者我今天喝了太多咖啡(到目前为止只有2或3杯)?

2 个答案:

答案 0 :(得分:11)

WCF(特别是DataContractSerializer)不使用构造函数。不,真的(它使用FormatterServices.GetUninitializedObject来创建原始对象)。

预计所有数据都将由序列化程序或非序列化字段初始化 - 通过您添加的序列化回调(例如,通过[OnDeserialized])。

答案 1 :(得分:1)

我完全理解原因,但是我不明白他们为什么不支持Silverlight中的序列化回调。在我看来,在WCF - Silverlight通信中,我无法在不自我攻击的情况下初始化我的数据合同。所以,如果我的基类中有一个私有成员供内部使用(例如undo-redo行为),则不能使用默认构造函数:

Stack<PropertyChange> UndoStack = new Stack<PropertyChange>();

这根本行不通。为了使它工作,我应该写这样的东西:

Stack<PropertyChange> _UndoStack;
Stack<PropertyChange> UndoStack
{
     get
     {
           return _UndoStack == null ? (_UndoStack = new Stack<PropertyChange>()) : _UndoStack;
     }
}

这对我来说似乎是一种解决方法。谁有更好的想法?