我正在使用一个复杂的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;
}
我怀疑第一种方法是首选 - 第二个例子中有很多dom操作,反序列化过程必须进行优化;然而,当xml显着增长时会发生什么?假设源返回1 MB的xml,我真的只对该xml的一个非常小的组件感兴趣。我是否应该让反序列化过程用它的所有数组和子节点的属性填充包含的ODM类?或者像第二个例子那样去获取子节点!! ??
不确定这会有所帮助,但这里是困境的摘要图像:
答案 0 :(得分:1)
布雷特,
.net的更高版本将构建自定义序列化程序集。点击项目属性 - &gt;构建并查找“生成序列化程序集”并更改为“打开”。 XML反序列化器将使用这些程序集,这些程序集是为项目中的类定制的。由于不涉及反射,它们更快,资源更少。
我会走这条路,这样如果你上课改变,你不必担心序列化问题。表现应该不是问题。
答案 1 :(得分:0)
我建议您不要预先优化。如果您的代码有效,请按原样使用。继续处理一些未完成但无效的代码。
稍后,如果您发现该区域存在性能问题,则可以探索性能。