サービスメソッドの結果として渡すクラスがあり、そのクラスにはget-onlyプロパティがあります。
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
サービス側で例外が発生しています:
System.Runtime.Serialization.InvalidDataContractException:タイプ 'MyNamespace.ErrorBase'のプロパティ 'Message'のsetメソッドはありません。
このプロパティはゲッターとしてのみ使用する必要があります。ユーザーに値を割り当てることはできません。使用できる回避策はありますか?または、追加の属性がありませんか?
Messageにpublic getterを設定しますが、保護されたsetterを使用します。これにより、サブクラス(およびDataContractSerializer:を不正行為するため)のみが値を変更できます。
値を更新する必要がない場合でも、WCFSerializerはセッターを使用してオブジェクトをデシリアライズします(そして値を再設定します)。
これはSOが後のものです: WCF DataContracts
[DataMember(Name = "PropertyName")]
public string PropertyName
{
get
{
return "";
}
private set
{ }
}
ゲッターのみを持っている場合、なぜプロパティをシリアル化する必要があるのでしょうか。読み取り専用プロパティのDataMember属性を削除でき、シリアライザはプロパティを無視するようです。
「何もしない」セッターを持っているだけではありませんか?
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message
{
get { return ""; }
set { }
}
}
それとも、DataContractシリアライザーもそれを妨げますか??
ASP.NET MVCでこの問題が発生し、DataContractSerializerを使用してJSON出力のアイテムの名前を制御できるようにしたいと考えていました。最終的に、シリアライザーをJSON.NETに切り替えました。これは、[JsonProperty(PropertyName = "myName")]
を介して、セッターなしのプロパティ(DataContractSerializerはサポートしていません)およびプロパティ名コントロール(ASP.NET MVCの組み込みJSONシリアライザーはサポートしていません)をサポートします。
実行可能なオプションの場合は、ErrorBase
を基本クラスとして使用する代わりに、次のように定義します。
public interface IError
{
string Message
{
[OperationContract]
get;
// leave unattributed
set;
}
}
現在、セッターは存在しますが、WCFチャネルを介してクライアントからアクセスできないため、プライベートであるかのように見えます。
DataMember属性を持つプロパティには常に設定が必要です。 DataContractメンバーには常に値を割り当てることができるため、クライアントアプリケーションでsimmilarオブジェクトを再作成する必要があります。