88

私が以下をシリアル化するとき:

[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も含まれています

4

4 に答える 4

129

デフォルトでは、WebAPIを使用し[Serializable]たり操作したりする必要はありません[DataContract]

モデルをそのままにしておくと、WebAPIがすべてのパブリックプロパティをシリアル化します。

何が含まれるかをより細かく制御したい場合にのみ、クラスと[DataContract]それに含まれるプロパティを装飾します[DataMember](DCSとJSON.NETの両方がこれらの属性を反映しているため)。

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

[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; }
}
于 2012-09-10T20:46:49.337 に答える
97

より一般的な解決策があります。属性を無視するようにJsonSerializerを構成できる[Serializable]ため、クラスの属性を変更する必要はありません。

この構成変更は、アプリケーションの開始時、つまりGlobal.asaxApplication_Startイベントで行う必要があります。

var serializerSettings =
  GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
var contractResolver =
  (DefaultContractResolver)serializerSettings.ContractResolver;
contractResolver.IgnoreSerializableAttribute = true;

日付をシリアル化するための形式を指定するなど、Jsonシリアル化に他の変更を加えることもできます。

これは、WebAPIJSONシリアル化にのみ適用されます。アプリ内の他のシリアル化(Web API XMLシリアル化、MVC JsonResult ...)は、この設定の影響を受けません。

于 2014-03-18T16:58:38.213 に答える
2

クラスのマーク付けには、Serializableの代わりにDataContractを使用してみてください。理由の詳細については、自動プロパティのシリアル化に関するこの優れたブログ投稿を参照してください。

于 2012-09-09T02:22:32.567 に答える
0

[DataContract]属性が機能しなかったため、オプションではありませんでした。

XmlSerializerはWebApiの[XmlAttribute]を無視します

上記の解決策は私にとってそれを解決しました。

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
于 2018-10-24T07:17:17.710 に答える