99

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

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

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

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

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

4

9 に答える 9

109

Message に public getter でありながら保護された setter を与えて、サブクラス (および DataContractSerializer は不正を行うため :) のみが値を変更できるようにします。

于 2010-02-24T02:34:34.570 に答える
13

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

このSOはあなたが求めているものです: WCF DataContracts

于 2010-02-24T02:31:43.607 に答える
11
[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}
于 2012-08-06T11:21:40.173 に答える
5

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

于 2016-09-23T21:18:25.850 に答える
5

「何もしない」セッターを持っていませんか??

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

それとも、DataContract シリアライザーもそれを口にしますか??

于 2010-02-24T06:05:08.510 に答える
2

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

于 2010-02-24T06:16:46.230 に答える
2

それが実行可能なオプションである場合はErrorBase、基本クラスとして持つ代わりに、次のように定義します。

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

            // leave unattributed
            set;
        }
    }

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

于 2012-05-25T22:32:17.680 に答える
2

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

于 2011-09-13T09:58:42.980 に答える
1

シリアライザのタイプがDataContractJsonSerializer(または any DataContractSerializer) の場合、プロパティを true に設定しDataContractSerializerSettingsてコンストラクタで使用することもできます。SerializeReadOnlyTypes

于 2020-05-28T13:39:17.267 に答える