2009-09-29 55 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