2011-01-20 62 views
2

我學習WCF和我今天所面臨的挑戰之一是實現這一設計:當WCF,系列化,只讀成員

[DataContract] 
public class MyOwnFaultException : FaultException<MyResult> 
{ 
    public MyOwnFaultException(MyResult result) : base(result) {} 
} 

[DataContract] 
public class MyResult 
{ 
    readonly DefinedResults dres; 

    public MyResult(DefinedResults res) { 
     dres = res; 
    } 

    [DataMember] 
    public DefinedResults DRes 
    { 
     get { return this.dres; } 
     //do not want to have the setter for this, but w.o it .net throws exception 
    } 
} 

[DataContract] 
public enum DefinedResults 
{ 
    Success = 0, 
    Fail = 1, 
} 

服務

[OperationContract] 
[FaultContract(typeof(MyOwnFaultException))] 
void TestRemoteException(); 

因此,很自然我嘗試創建一個對我的'錯誤'服務的引用,我得到了「不爲DRes成員設置成員」的例外情況。但是,如何將只讀字段模式實現爲用於結果指示符的值對象?

回答

1

使用WCF時沒有值對象。所有通過操作接收和發送的對象必須是可序列化的 - 必須具有無參數的構造函數(如marc指出的,對於DataContractSerializer,這不是必需的),並且所有序列化字段都必須是可寫的。如果你想發送不可序列化的對象,你可以實現IDataContractSurrogate或者只是實現你自己的數據傳輸對象(DTO)。

+3

實際上,對於DataContractSerializer的,類做**不**不需要任何參數的構造函數(這僅適用於XmlSerializer的)....見http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/解釋 – 2011-01-20 20:45:25

+0

@marc:謝謝,我不知道,但通過閱讀文章是有道理的。 – 2011-01-20 23:01:36

3

這是因爲服務共享模式和合同,而不是類。

說了這麼多,你可以做本事:

[DataMember] 
public DefinedResults DRes 
{ 
    get { return this.dres; } 
    private set { /* NOOP */ } 
}