标题中的问题......简而言之 - 我有一个WCF服务公开返回实体类的操作。客户端类继承自抽象基类而不是默认的System.Object。抽象基类定义了默认构造函数。当调用其中一个服务方法时,我希望在datacontract序列化器实现返回的对象时调用构造函数。但是,不会调用构造函数。另一方面,如果我自己创建实体类的实例,则调用抽象类构造函数。
为什么,为什么,并且有解决方法吗?或者我错过了什么 - 是否有另一个构造函数签名由datacontract序列化程序在实现对象时调用?如果没有,datacontract序列化程序如何在不调用构造函数的情况下实现对象,就像“new SomeClass()”调用一样?或者我今天喝了太多咖啡(到目前为止只有2或3杯)?
答案 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;
}
}
这对我来说似乎是一种解决方法。谁有更好的想法?