web-dev-qa-db-ja.com

WCFは、「設定」のないプロパティでチョークします。回避策はありますか?

サービスメソッドの結果として渡すクラスがあり、そのクラスにはget-onlyプロパティがあります。

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

サービス側で例外が発生しています:

System.Runtime.Serialization.InvalidDataContractException:タイプ 'MyNamespace.ErrorBase'のプロパティ 'Message'のsetメソッドはありません。

このプロパティはゲッターとしてのみ使用する必要があります。ユーザーに値を割り当てることはできません。使用できる回避策はありますか?または、追加の属性がありませんか?

93
Andrey

Messageにpublic getterを設定しますが、保護されたsetterを使用します。これにより、サブクラス(およびDataContractSerializer:を不正行為するため)のみが値を変更できます。

102
rh.

値を更新する必要がない場合でも、WCFSerializerはセッターを使用してオブジェクトをデシリアライズします(そして値を再設定します)。

これはSOが後のものです: WCF DataContracts

12
Russell
[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}
10
Rikin Patel

ゲッターのみを持っている場合、なぜプロパティをシリアル化する必要があるのでしょうか。読み取り専用プロパティのDataMember属性を削除でき、シリアライザはプロパティを無視するようです。

5
Rob Lambert

「何もしない」セッターを持っているだけではありませんか?

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

それとも、DataContractシリアライザーもそれを妨げますか??

3
marc_s

ASP.NET MVCでこの問題が発生し、DataContractSerializerを使用してJSON出力のアイテムの名前を制御できるようにしたいと考えていました。最終的に、シリアライザーをJSON.NETに切り替えました。これは、[JsonProperty(PropertyName = "myName")]を介して、セッターなしのプロパティ(DataContractSerializerはサポートしていません)およびプロパティ名コントロール(ASP.NET MVCの組み込みJSONシリアライザーはサポートしていません)をサポートします。

2

実行可能なオプションの場合は、ErrorBaseを基本クラスとして使用する代わりに、次のように定義します。

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

            // leave unattributed
            set;
        }
    }

現在、セッターは存在しますが、WCFチャネルを介してクライアントからアクセスできないため、プライベートであるかのように見えます。

2
Gilad

DataMember属性を持つプロパティには常に設定が必要です。 DataContractメンバーには常に値を割り当てることができるため、クライアントアプリケーションでsimmilarオブジェクトを再作成する必要があります。

2
Jojo Sardez