2009-09-29 59 views
4

我的WCF REST服务发生了一个奇怪的问题。对于在那里接受数据的操作,比方说,它接受Foo类:WCF REST服务 - DataContract停止构造函数?

[WebInvoke(Method = "PUT", UriTemplate = "users/{username}")] 
[OperationContract] 
public void UpdateLoginUser(string username, LoginUser userUpdated) { 
[...] 
} 

现在我LoginUser类从我NormalUser类继承:

<DataContract()> _ 
Public MustInherit Class NormalUser 
[...] 
End Class 

Public Class LoginUser 
Inherits NormalUser 
[...] 
End Class 

当我把我的服务,引发UpdateLoginUser,一切正常。但是,如果我申请DataContract我NormalUser类:

<DataContract()> _ 
Public Class LoginUser 
Inherits NormalUser 
[...] 
End Class 

...突然,LoginUser类的构造函数不反序列化期间火!我有我需要运行的商业登录规则。那么,为什么当我将DataContract属性应用于我的继承类时,其构造函数会停止被解雇?我怎样才能解决这个问题?如果我想更改名称空间或名称,我确实需要应用DataContract属性。

回答

6

DataContractSerializer不会调用合同的构造。如果你想有一个方法来反序列化时运行与OnDeserializing attrbute装饰它:

当应用于方法,指定 ,该方法是在 反序列化对象的调用。

你的另一个选择是use XmlSerializer with WCF

WCF还支持XmlSerializer的 类。 XmlSerializer类不是WCF特有的 。它与ASP.NET Web 服务使用的是相同的 序列化引擎。 XmlSerializer类 支持窄得多的类型集合 比的DataContractSerializer类, 但允许更多的控制在 生成的XML并支持多XML模式定义语言 (XSD)标准的更 。它也不需要 需要在可序列化类型上的任何声明性属性。欲了解更多 信息,请参阅.NET框架 文档中的XML序列化 话题。 XmlSerializer类 不支持数据协定类型。

+0

这是一个主要的PITA,因为虽然我可以将OnDeserializing属性应用于我的构造函数方法,但我该如何处理默认值? (eh。Private xyz As String =“abc”) - 初始化计算为构造函数的一部分,对,并且它不会完成? – Jez 2009-09-29 14:14:41

+0

或者在'[OnDeserialized]'属性中使用一个方法,这个方法在整个事情被反序列化后被调用 – 2009-09-29 14:15:09

+0

@ jez9999:在方法中也执行成员初始化。 @marc_s:对 - 很好。 – 2009-09-29 14:20:54

2

DataContract(de)序列化程序确实是不是调用构造函数。

这听起来很奇怪而且很疯狂 - 但这就是它的工作方式,而且没有办法改变它。

因此,DataContract序列化程序也会这样做不需要需要无参数构造函数(如XmlSerializer或其他)。

马克

+0

那么,为什么如果我没有指定DataContract,但是我的类INHERITS来自一个类,那么INHERITS *所做的类有它的构造函数调用? :-)这不完全不一致和古怪吗? – Jez 2009-09-29 14:09:36

+0

这就是WCF的工作方式。 DataContractSerializer将仅用于显式地具有[DataContract]属性的类 - 它是** NOT **从父类继承到子类。这正是WCF设计的方式。 – 2009-09-29 14:16:05