2009-10-12 2 views
2

Я работаю со сложной схемой 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 со всеми его массивами и свойствами дочерних узлов? Или просто запустите дочерний узел, как во втором примере! ??

Не уверен, что это помогает, но вот краткое изображение дилеммой:

alt text

ответ

1

Brett,

Более поздние версии .net будут строить собственные Serializer сборки. Нажмите на свойства проекта -> сборка и найдите «Генерировать сборки сериализации» и измените на «Вкл.». XML-десериализатор будет использовать эти сборки, которые настроены на классы в вашем проекте. Они намного быстрее и менее ресурсоемкими, поскольку отражение не задействовано.

Я бы пошел по этому маршруту, так что если вы измените класс, вам не придется беспокоиться о проблемах с сериализацией. Производительность не должна быть проблемой.

0

Я рекомендую вам не preoptimize. Если ваш код работает, используйте его как есть. Продолжайте работать над некоторым кодом, который еще не закончен, или который не работает.

Позже, если вы обнаружите, что у вас есть проблемы с производительностью в этой области, вы можете изучить производительность.

Смежные вопросы