ドメインオブジェクトを大量の属性で汚染することなく、ほとんどのオブジェクトをシリアル化できる C# 用の XML シリアライザー用のクローズドまたはオープンソースのプロジェクトはありますか? 内部ジェネリック クラスで構築されたコレクションのシリアル化も処理しますか? おまけとして、インターフェイス タイプのプロパティのシリアル化を処理できます。別のボーナスは、読み取り専用のプロパティを持つオブジェクトをシリアル化できることです (または、少なくとも内部とマークされた get アクセサーを使用して)
2 に答える
まず、「高度」を定義します。つまり、具体的に何が必要で、何が必要かを定義しますXmlSerializer
。POCOに関しては、オブジェクトモデルに追加する必要がないように、追加したいXmlSerializer
すべての属性を受け入れるオーバーロードされたctorがありますが、それでもパブリックのパラメーターなしのコンストラクターが必要であり、パブリックの読み取り/書き込みでのみ機能しますフィールド/プロパティ。このアプローチを使用する場合は、シリアライザーをキャッシュ/再利用する必要があります。
ほとんどの場合、これで「十分」であるという理由だけで、既存のドメインオブジェクトをブルートフォースで DTO にしようとするのはしばしば間違いです。ドメイン エンティティを、属性が付けられた(適切な ctor/properties/etc を持つ) 新しい DTO に単純にマップする方が、より簡単で保守しやすい場合があります。
ctor/properties の問題DataContractSerializer
にはいくつかの回答がありますが、xml がどのように見えるかを細かく制御することはできません。
- InternalsVisibleToAttribute を使用して、System.Xml.dll が内部にアクセスできるようにすることができます。したがって、内部型および/または内部メンバーをシリアル化します。内部 .ctors を含みます。
- クラスに IXmlSerializable を実装して、シリアル化をカスタマイズすることもできます (インターフェイス参照を含むコンテナーなど)。
- クラスに XML シリアライゼーション属性を提供する必要はありませんが、代わりに XmlAttributeOverrides として提供してください。
XmlSerializer は、ほとんどの場合、人々が望んでいるものとまったく同じです。彼らは、XmlSerializer が実際ほど柔軟であることを知りません。