2010-02-24 24 views
85

我有一些類,我傳遞作爲服務方法的結果,那類有一個專用的獲取屬性:WCF在沒有「設置」的屬性上扼流圈。任何解決方法?

[DataContract] 
public class ErrorBase 
{ 
    [DataMember] 
    public virtual string Message { get { return ""; } } 
} 

我得到的服務端異常:

System.Runtime.Serialization.InvalidDataContractException:沒有設置 屬性'Message'的類型爲'MyNamespace.ErrorBase'的方法。

我必須把這個屬性當作只有getter,我不能讓用戶給它賦值。我可以使用任何解決方法?或者我錯過了一些額外的屬性?

回答

93

給消息一個公共的getter但保護的二傳手,所以只有子類(和DataContractSerializer的,因爲它欺騙:)可以修改的值。

+1

其實,它在我的情況下效果最好!謝謝! – Andrey 2010-02-24 22:22:41

+0

這是一個很好的解決方案! – Russell 2010-03-01 02:01:12

+0

謝謝,很高興它是有用的!這實際上只是這個技巧的幾個用途之一。由於getter和setter在技術上是功能性的,所以你也可以使用這種相同的技術來提供基本類型的自定義序列化(可能是XML中的自定義時間格式),而不需要使用恐嚇IDataContractSurrogate。 – 2010-03-01 18:02:43

12

即使您不需要更新該值,該設置器也會被WCFSerializer用於反序列化對象(並重新設置該值)。

這SO爲你所追求的: WCF DataContracts

+1

所以我解決這個問題的唯一方法是讓它成爲一種方法而不是屬性?再次,我不能允許「設置」在這個屬性 – Andrey 2010-02-24 02:33:37

+0

你可以使它成爲一種方法(例如GetMessage(){return「」;})或者,我非常確定你可以告訴WCF串行器忽略它。我會看看我能找到並讓你知道。, – Russell 2010-02-24 02:34:58

+1

這個stackoverflow問題擊中了頭上的指甲:http://stackoverflow.com/questions/172681/wcf-datacontracts – Russell 2010-02-24 02:36:08

3

難道你不能只有一個「什麼都不做」二傳手?或者DataContract序列化程序barf也是這樣嗎?

+13

它並不禁止,我只是不想讓使用客戶端API的開發人員認爲他們可以將東西分配給屬性。 – Andrey 2011-10-14 18:10:44

2

具有DataMember屬性的屬性始終需要設置。您應該在客戶端應用程序上重新編寫simmilar對象,因爲DataContract成員始終可以分配值。

2

我有ASP.NET MVC這個問題,我想要使用DataContractSerializer,以便能夠控制JSON輸出中的項目名稱。最後,我將序列化程序切換到JSON.NET,它通過[JsonProperty(PropertyName = "myName")]支持沒有setter(DataContractSerializer沒有)和屬性名稱控制(ASP.NET MVC中的內置JSON序列化程序沒有)的屬性。

2

如果它是一個可行的選擇,然後而不是ErrorBase作爲基類,如下定義它:

public interface IError 
    { 
     string Message 
     { 
      [OperationContract] 
      get; 

      // leave unattributed 
      set; 
     } 
    } 

現在,即使制定者存在,它是不可訪問通過WCF通道的客戶端,因此就好像它是私人的。

7
[DataMember(Name = "PropertyName")] 
public string PropertyName 
{ 
    get 
    { 
     return ""; 
    } 
    private set 
    { } 
} 
5

如果你只有一個getter,你爲什麼需要序列化屬性。您似乎可以刪除只讀屬性的DataMember屬性,並且序列化程序只會忽略該屬性。

+2

將派生屬性(例如,從ID屬性計算出來的URL屬性)序列化到持久性存儲(例如數據庫)確實沒有意義 - 向上投票 - 但將它序列化爲由API請求返回的表示形式(例如,JSON或XML)。 – 2017-05-12 13:21:36

相關問題