2017-09-03 11 views
1

xmlのシリアル化について私が学んでいるすべてのサンプルでは、​​プライベートバックストアフィールドを持つパブリックプロパティを使用してサンプルが示されていました。xmlファイルのシリアル化にプライベートフィールドは必須ですか?

しかし、その後、私はこれが見つかりました:

https://blog.udemy.com/csharp-serialize-to-xml/

を私もそれが舞台裏で行われているように、C#3.0で、あなたが常にバッキングストアフィールドを必要としないことを学びました。

私はコードを単純化し、リンクをたどってパブリックプロパティを使用するだけですか?

+0

「XmlSerializer」を使用している場合は問題ありません。しかし、あなたのタイプを '[Serializable]'とマークし、 'DataContractSerializer'を使用すると、[DataContractSerializerの出力をよりクリーンなXMLにする方法はありますか?](https: //stackoverflow.com/q/1953984)。一般に、 '[Serializable]'は自動プロパティでうまく動作しませんが、必要がなく、明示的なバッキングフィールドを使用しない場合は、属性を削除することができます。 – dbc

答えて

1

明示的なプライベートバッキングフィールドは、パブリックフィールドとプロパティをシリアル化することしかできないXmlSerializerでは完全に不要です。限りバッキングフィールドがプライベートであるとして、XmlSerializerは、それが明示的であるかdocsで説明したように、密かに、コンパイラによって作成されたかどうかを検出する方法がありません:

あなたは[自動実装プロパティ]を宣言した場合、コンパイラプロパティのgetおよびsetアクセサを使用してのみアクセスできるプライベートの匿名のバッキングフィールドを作成します。あなただけ(デフォルトでDefaultContractResolver.IgnoreSerializableAttribute = true、またはXmlSerializerを使用してシリアル化されている場合は

、右先に行くと、自動実装プロパティを使用してクラスを簡素化します。

ただし、自動実装されたプロパティは[Serializable]で機能しないことに注意してください。あなたは、この属性を持つタイプをマークすると、あなたはそれがその内部状態をシリアル化することにより、シリアル化できることを示している - その公共および民間フィールド - というよりもその外部状態 - そのパブリックプロパティを。この属性はXmlSerializerによって完全に無視されますが、DataContractSerializer,DataContractJsonSerializerおよびBinaryFormatterなどの他のシリアライザもサポートしています。自動実装のプロパティを持つ型に属性を追加すると、シークレット "匿名"のバッキングフィールドの名前が、シリアライザによって作成されたシリアル化ストリームに表示され始める可能性があります。

あなたは、自動実装プロパティを使用しているのであれば、私の推薦はあなたのタイプから[Serializable]属性を削除することです。おそらくそれを必要とせず、データ契約のシリアライゼーションはそれなしでうまく機能し、どんな場合でも、herehereのように、.NETコアでの使用は推奨されなくなります。(伝えバイナリシリアルは、.NETのコア2.0である程度実装なっているが、詳細についてはhereを参照してください。)


なぜフィールド? .Net 1.1の時間枠では、プライベート状態をシリアル化することが、パブリック状態をシリアル化するよりも好ましいかどうかについての議論がまだ残っていました。これはもはや議論されておらず、国家(またはデータ契約によって指定された国家)のシリアライズが優先されます。