私web method
の場合、サードパーティのC#エンティティクラスのオブジェクトを取得します。エンティティクラスはに他なりませんDataContract
。このエンティティクラスは非常に複雑で、さまざまなタイプのプロパティがあります。一部のプロパティもコレクションです。もちろん、これらのリンクされたタイプはDataContractsでもあります。
Webサービスのビジネスロジックの一部として、そのDataContractエンティティをXMLにシリアル化したい。XMLスキーマがまったく異なるという理由だけで、(Webメソッドで受け取ったオブジェクトで)直接使用することはできません。DataContractSerializer
したがって、DataContractSerializerによって生成されたXMLは、スキーマに対して検証されません。
実装のために従うべきアプローチを結論付けることはできません。次の実装アプローチを考えることができます。
LINQ to XML-これは問題ないように見えますが、オブジェクトのタイプごとに手動でXMLツリー(つまり、クラスインスタンスの要素またはXML表現)を作成する必要があります。多くのエンティティクラスがあり、それらは相互にリンクされているため、XML要素を手動で作成するには手間がかかりすぎると思います。さらに、エンティティクラスが新しいプロパティを導入するときに、XMLツリーを変更し続ける必要があります。これだけでなく、私がXMLツリーを生成するコードは(少なくとも見た目は)少し不器用に見え、将来、他の開発者が保守/変更するのが難しくなります。彼/彼女は、そのXMLがどのように生成されるかを理解するために、それを非常に綿密に調べる必要があります。
XmlSerializer-必要なXML構造を表す独自のエンティティクラスを作成できます。次に、着信オブジェクトから自分のクラスのオブジェクトに詳細をコピーする必要があります。したがって、これは追加の作業です(コードが実行されるときの.NETの場合も同様です!)。次に
XmlSerializer
、オブジェクトでXMLを生成するために使用できます。この場合、エンティティクラスを作成する必要があり、サードパーティエンティティが変更されるたびに、クラスに新しいプロパティを追加するだけで済みます。(XmlElementまたはXmlAttibute属性を使用)。しかし、人々はDataContractSerializer
これよりも推奨しているので、すべての側面が私に明確でない限り、これを完成させたくありません。DataContractSerializer-ここでも、サードパーティのDataContractsを制御できないため、独自のエンティティクラスを作成する必要があります。そして、着信オブジェクトから自分のクラスのオブジェクトに詳細をコピーする必要があります。したがって、これは追加の作業です。ただし、DataContractSerializerはXml属性をサポートしていないため、
IXmlSerializable
必要なXmlをWriteXml
メソッドで実装および生成する必要があります。DataContractSerializerはXmlSerializerよりも高速ですが、サードパーティのエンティティが変更された場合は、(WriteXmlで)変更を処理する必要があります。
質問:
- パフォーマンスも考慮して、このシナリオで最適なアプローチはどれですか?
- より良いアプローチを提案できますか?
- 着信エンティティクラスが変更される可能性がある場合
DataContractSerializer
は、(パフォーマンスが優れているため)検討する価値がありますか?XmlSerilaizer
- LINQは本当にシリアル化に使用する必要がありますか?それとも、クエリ以外のことには本当に良いのでしょうか?
- このような場合、XmlSerializerをLINQよりも優先できますか?はいの場合、なぜですか?