web-dev-qa-db-ja.com

DataContractSerializerを使用してシリアル化するときにプロパティを無視するにはどうすればよいですか?

.NET 3.5SP1とDataContractSerializerを使用してクラスをシリアル化しています。 SP1では、クラスにDataContract/DataMember属性を含める必要がなく、すべてをシリアル化するように動作が変更されました。これは私が使用している動作ですが、今度はシリアライザーの1つのプロパティを無視する必要があります。これを行う1つの方法は、DataContract属性をクラスに追加し、含めるメンバーすべてにDataMember属性を追加することです。しかし、私にはこれがうまくいかない理由があります。

だから私の質問は、DataContractSerializerにプロパティを無視させるために使用できる属性または何かがありますか?

113
NotDan
164
Paul Ruane

さらに、DataContractSerializerは[Serializable]としてマークされた項目をシリアル化し、匿名型のシリアル化のサポートを可能にするために、.NET 3.5 SP1以降でマークされていない型もシリアル化します。

したがって、メンバーのシリアル化を防ぐ方法については、クラスをどのように装飾したかによって異なります。

  • [DataContract]を使用した場合は、プロパティの[DataMember]を削除します。
  • [Serializable]を使用した場合、プロパティのfieldの前に[NonSerialized]を追加します。
  • クラスを装飾していない場合は、[IgnoreDataMember]をプロパティに追加する必要があります。
150
Doug

XMLシリアル化では、[XmlIgnore]属性(System.Xml.Serialization.XmlIgnoreAttribute)を使用して、クラスをシリアル化するときにプロパティを無視できます。

これはあなたにとって役に立つかもしれません(または、私がそうであったように、XMLでシリアライズするときにプロパティーを無視する方法を見つけようとするときに、この質問を見つけた人にとって役に立つかもしれません)。

30
Kris Adams

[NonSerialized()]属性でフィールドをマークしてみてください。これは、フィールドを無視するようにシリアライザーに指示します。

https://msdn.Microsoft.com/en-us/library/system.nonserializedattribute(v = vs.110).aspx

1
Cris Valenzuela

あなたが言っていることは、この場所にあるMSDNライブラリでそれが言っていることと矛盾しています:

http://msdn.Microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx

あなたが言及したSP1機能については何も言及していません。

0
Tony The Lion