1. ホーム
  2. serialization

[解決済み] .NET WebAPI Serialization k_BackingField Nastiness

2023-05-02 02:52:40

質問

以下のようにシリアライズすると

[Serializable]
public class Error
{

    public string Status { get; set; }
    public string Message { get; set; }
    public string ErrorReferenceCode { get; set; }
    public List<FriendlyError> Errors { get; set; }
}

こんな気持ち悪いのが出るんだ。

<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance"   xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api">
<_x003C_Errors_x003E_k__BackingField>
An exception has occurred. Please contact printmee support
</_x003C_Errors_x003E_k__BackingField>
<_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField>
</ErrorRootOfstring>

どうしたらいいの?どうすればきれいになるのでしょうか?JSONの応答には、k_BackingFieldも含まれます。

どのように解決するのですか?

初期状態では [Serializable][DataContract] で、Web APIと連携することができます。

モデルをそのままにしておくだけで、Web APIがすべてのパブリックプロパティをシリアライズしてくれます。

何が含まれるかをもっとコントロールしたい場合のみ、クラスを [DataContract] で飾り、含まれるプロパティを [DataMember] (に含まれるプロパティ(DCSとJSON.NETの両方がこれらの属性を尊重するため)。

もし何らかの理由で [Serializable] が必要な場合 (例えば、何らかの理由でメモリストリームにシリアライズする場合、ディープコピーを行う場合など)、バッキングフィールド名を防ぐために両方の属性を組み合わせて使用する必要があります。

[Serializable]
[DataContract]
public class Error
{
    [DataMember]
    public string Status { get; set; }
    [DataMember]
    public string Message { get; set; }
    [DataMember]
    public string ErrorReferenceCode { get; set; }
    [DataMember]
    public List<FriendlyError> Errors { get; set; }
}