Я работаю со сложной схемой xml, для которой я создал структуру класса, используя xsd.exe (с некоторыми усилиями). Теперь я могу надежно десериализовать xml в сгенерированную структуру классов. Например, рассмотрим следующий XML из веб-службы:Эффективность десериализации по сравнению с XmlReader
<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() возвращает поток 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;
}
Я подозреваю, что первый подход является предпочтительным - есть много йот манипуляций происходят во втором примере, и процесс десериализации должен иметь оптимизацию; однако, что происходит, когда xml резко возрастает? Предположим, что источник возвращает 1 МБ xml, и меня действительно интересует очень маленький компонент этого xml. Должен ли я позволить процессу десериализации обрабатывать класс ODM со всеми его массивами и свойствами дочерних узлов? Или просто запустите дочерний узел, как во втором примере! ??
Не уверен, что это помогает, но вот краткое изображение дилеммой: