2012-05-22 2 views
0

Извините за дерьмовый заголовок. Не стесняйтесь менять его на лучшую.XML десериализация слабо типизированных объектов в .NET

Проблема заключается в следующем: у меня есть необходимость чтения набора файлов XML, которые выглядят так:

<rootElement> 
    <header> 
     <!-- some stuff here --> 
    </header> 
    <businessContent> 
     <oneOfSeveralAllowedSubNodesHereLikeCustomer /> 
    <businessContent> 
</rootElement> 

я получил xsd.exe генерировать классы C# из файла схемы у меня есть, и это сделало это так (упрощенно):

public class rootElement 
{ 
    public header header {get;set;} 
    public object businessContent {get;set;} 
} 
// other classes like header and classes for the values 
// allowed within business content, say customer 

Обратите внимание, что тип businessContent является System.Object, который является достаточно справедливым. В схеме ничего явно не говорится о том, что на самом деле можно положить туда. Но тогда у меня есть xml-файл, который имеет customer внутри своего businessContent. клиент определяется в xsd, а xsd.exe создал для него класс. Я ожидал бы экземпляр этого класса должен быть создан и положить, как мой businessContent, но когда я прочитал XML:

var serializer = new XmlSerializer(typeof(rootElement)); 
var root = (rootElement)serializer.Deserialize(stream)); 
var customer = (customer)root.businessContent; 

я получаю исключение, потому что тип root.businessContent является XmlNode[] и не customer.

Как сделать сериализатор для десериализации моего объекта полностью, то есть с customer, а не XmlNode[] внутри?

ответ

1

Serializing and restoring an unknown class

var extraTypes = new[] { typeof(customer), typeof(otherAllowedSubnodeTypes) }; 
var serializer = new XmlSerializer(typeof(rootElement), extraTypes); 
+0

Это заканчивается в исключениях жалуется, что анонимный типа клиент не может быть использован здесь – kko

+0

Является ли это ошибка компилятора или исключение во время выполнения? Можете ли вы дать нам точное сообщение об ошибке? 'customer' не является анонимным, поэтому я не понимаю, что вы сказали. –

+0

имеет [System.Xml.Serialization.XmlTypeAttribute (AnonymousType = true)] – kko

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