在第一个场景中,一切都很简单,我有以下XML,我可以反序列化为强类型。
<providers>
<dprovider>
<dimensions>
<width></width>
</dimensions>
</dbrovider>
在第二种情况下,这是我需要帮助的地方......我有一些更有活力的东西
<providers>
<dprovider>
<dimensions>
<width></width>
</dimensions>
</dbrovider>
<dprovider>
<dimensions>
<height></height>
</dimensions>
</dbrovider>
正如您所看到的那样,维度子结构在两个项目中都是不同的,所以我需要找到一种方法来创建强类型类,以便它可以处理对维度元素的任何更改,例如它可以包含一个整体嵌套的子结构,每个dbprovider都不同。
关于如何做到的任何想法?
答案 0 :(得分:2)
试试这个:
[Serializable]
class Dimension { ... }
[Serializable]
class Height : Dimension { ... }
[Serializable]
class Width : Dimension { ... }
然后,在你的(注意复数)元素反序列化的类中,有这个属性:
[XmlElement( Type = typeof( Height ), ElementName = "height" )]
[XmlElement( Type = typeof( Width ), ElementName = "width" )]
public Dimension[] DimensionArray {
get { ... }
set { ... }
}
这是documentation on XML serialization(XmlElement类)的起点,因此您可以找出其余的细节。
您应该能够通过从 System.Xml.Serialization 命名空间中使用正确的属性装饰正确的属性和类来序列化/反序列化您的提供者对象。
答案 1 :(得分:1)
我认为您可能忽略了C#对XML序列化/反序列化的重点。
您应该定义一个模式(或使用您已经拥有的模式)并创建一个支持它的C#类。 See MSDN article on xsd.exe
另一种方法是创建C#类(并将其包装在标记的集合中)并添加XML属性。这基本上将定义您的XML架构。 See here for starting point on the XmlRootAttribute
答案 2 :(得分:0)
首先想到的是自定义反序列化。此时,您的dprovider类可以具有List&lt; object&gt;称为Dimensions,它具有您需要的主机对象。唯一的痛苦就是将它们拉回来,因为你必须做一堆“是”的逻辑。
如果您希望拥有“整个嵌套子结构”,则应将该子结构定义为其自己的类/结构,然后将其添加到“维度”列表中。