私のアプリケーションは、主に JSON を使用して、フロント エンド クライアントとやり取りします。ただし、私のアプリケーションには、XML をファイルに出し入れする Import/Export コンポーネントがあります。
JSON をシリアル化するときは、JSON.NET を使用します (デフォルトの Web API の動作)。XML をシリアル化するときは、DataContractSerializer (デフォルトの Web API の動作) を使用します。
XML にシリアル化するときに、オブジェクトに関連付けられた特定のコレクションとプロパティを XML に含めたくありません。
JsonIgnore は、JSON をシリアル化するときにのみこれを行うため、機能しません。
IgnoreDataMember は JSON と XML の両方に対してこれを行うため、機能しません。(古いバージョンではこれが機能していたように見えますが、残念ながら世界は常に変化しています)。
ShouldSerialize{PropertyName} も JSON でのみ動作するように見えるため、動作しません。
これは、edmx ファイルから T4 テンプレートを介してエンティティを生成する Entity Framework Database First プロジェクトであるため、各フィールドに DataContract と Datamember を設定する OPT-IN アプローチを使用したくありません。しかし、私は試してみましたが、無視することができました
[OnSerializing]
public void IgnoreIfXml(StreamingContext context)
{
if (IsXML)
{
this.ThingIwantToIgnore = null;
}
}
そして、メンバーでエミットのデフォルト値を false に設定します。
[DataMember(EmitDefaultValue=false)]
public virtual ICollection<AThing> ThingIwantToIgnore { get; set; }
IsXml は、クライアントが xml を期待している場合に true であるコントローラー呼び出しに基づいて設定したプロパティです。
このアプローチの問題は、デフォルト値をフロントエンドに戻したいものであるnull可能なフィールドやその他のフィールドがいくつかあるため、これも機能しないことです。次に、Global.asax で UseXmlSerializer = true を設定して XMLSerializer を使用しようとしましたが、アプリケーションは XML にシリアル化できないかのように、XML ではなく JSON を返し続けました。私もできればこのルートは避けたいと思っています。
XML にシリアル化する場合にのみ無視する方法について、誰か提案はありますか? XmlSerializer はより狭いタイプのセットをサポートするため、DataContractSerializer に固執することを含む提案に特に興味があります。