私は複雑な xml スキーマを使用しています。そのために、xsd.exe を使用してクラス構造を作成しました (多少の労力を要します)。xml を生成されたクラス構造に確実に逆シリアル化できるようになりました。たとえば、Web サービスの次の xml について考えてみます。
<ODM FileType="Snapshot" CreationDateTime="2009-10-09T19:58:46.5967434Z" ODMVersion="1.3.0" SourceSystem="XXX" SourceSystemVersion="999">
<Study OID="2">
<GlobalVariables>
<StudyName>Test1</StudyName>
<StudyDescription/>
<ProtocolName>Test0001</ProtocolName>
</GlobalVariables>
<MetaDataVersion OID="1" Name="Base Version" Description=""/>
<MetaDataVersion OID="2" Name="Test0001" Description=""/>
<MetaDataVersion OID="3" Name="Test0002" Description=""/>
</Study>
</ODM>
次のように xml を逆シリアル化できます。
public ODMcomplexTypeDefinitionStudy GetStudy(string studyId)
{
ODMcomplexTypeDefinitionStudy study = null;
ODM odm = Deserialize<ODM>(Service.GetStudy(studyId));
if (odm.Study.Length > 0)
study = odm.Study[0];
return study;
}
Service.GetStudy() は、Web サービスから HTTPResponse ストリームを返します。Deserialize() は、ストリームをオブジェクト型 T に逆シリアル化するヘルパー メソッドです。
私の質問は次のとおりです。逆シリアル化プロセスでクラス構造全体を作成して xml を逆シリアル化する方が効率的ですか、それとも対象の xml のみを取得してその xml を逆シリアル化する方が効率的ですか。たとえば、上記のコードを次のように置き換えることができます。
public ODMcomplexTypeDefinitionStudy GetStudy(string studyId)
{
ODMcomplexTypeDefinitionStudy study = null;
using (XmlReader reader = XmlReader.Create(Service.GetStudy(studyId)))
{
XDocument xdoc = XDocument.Load(reader);
XNamespace odmns = xdoc.Root.Name.Namespace;
XElement elStudy = xdoc.Root.Element(odmns + "Study");
study = Deserialize<ODMcomplexTypeDefinitionStudy>(elStudy.ToString());
}
return study;
}
最初のアプローチが好まれると思います.2番目の例では多くのdom操作が行われており、逆シリアル化プロセスには最適化が必要です。しかし、xml が劇的に大きくなるとどうなるでしょうか? ソースが 1 MB の xml を返し、私が本当に関心があるのはその xml の非常に小さなコンポーネントだけだとします。逆シリアル化プロセスで、含まれている ODM クラスをすべての配列と子ノードのプロパティで満たす必要がありますか? または、2番目の例のように子ノードを取得してください!!??
これが役立つかどうかはわかりませんが、ジレンマの要約画像を次に示します。