2011-10-05 175 views
1

以下XML一个ArrayList是序列化资产OBJETS反序列化XML到对象在C#

<ArrayOfAsset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Asset> 
    <name>bill</name> 
    <type>perosn</type> 
    </Asset> 
    <Asset> 
    <name>bill</name> 
    <type>perosn</type> 
    </Asset> 
</ArrayOfAsset> 

我可以用默认的C#解串器没有问题,这反序列化的ArrayList的结果。如果我的根元素从ArrayOfAsset更改为资产,我的解串器爆炸了。我怎样才能让我的解串器知道这个变化。

这里是我的反串行化代码:

StreamReader sr = new StreamReader("c:\\assest.xml"); 
    string r = sr.ReadToEnd(); 
    List<Asset> list; 
    Type[] extraTypes = new Type[1]; 
    extraTypes[0] = typeof(Asset); 
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<Asset>), extraTypes); 
    object obj = serializer.Deserialize(xReader); 
    list = (List<Asset>)obj; 
+0

序列化程序是否要写入您正在反序列化的XML,或者您是否有其他源? – driis

+0

“XmlSerializer”类预计XML的格式与它生成的格式相同,而不是您的任意格式。您需要为此编写自己的XML反序列化类。 – Polynomial

回答

0

我有同样的问题。

在MSDN文档中指定:

注的XmlSerializer无法反序列化下列:的ArrayList阵列和列表的阵列。

但我真的不知道这是否意味着你不能反序列化ArrayList或ArrayList的数组......对我而言这并不清楚。

http://msdn.microsoft.com/en-us/library/dk9cbaf1%28v=vs.110%29.aspx

使用服务栈串行:)

0

只要你使用 “默认” 的序列化,你不能改变的XML格式。为了支持微调的XML,你必须提供一些覆盖默认序列化的元数据。例如:https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlarray(v=vs.110).aspx

此外它可能是值得将属性附加到您的资产类(及相关)。这样,您可以描述[XmlArray]和[XmlArrayItem]以支持所需的标记/子标记https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute(v=vs.110).aspx