XmlSerializer保存元素顺序

时间:2015-04-09 15:16:17

标签: c# .net xml deserialization

所以我有一个父类排列的不同Xml元素列表:

    <Group>
      <Circle Radius="5"/>
      <Rectangle Height="10" Width="15"/>
      <Rectangle Height="7" Width="8"/>
      <Circle Radius="12"/>
    </Group>

班级:

    public class Group
    {
      [XmlElement("Circle")]
      public List<Circle> Circles { get; set;}

      [XmlElement("Rectangle")]
      public List<Circle> Circles { get; set;}
    }

    public class Circle
    {
      // The position it was encountered in the list of elements
      public int Position { get; set; }

      [XmlAttribute("Radius")]
      public string Radius { get; set;}
    }

    public class Rectangle
    {
      // The position it was encountered in the list of elements
      public int Position { get; set; }

      [XmlAttribute("Width")]
      public string Width { get; set; }

      [XmlAttribute("Length")]
      public string Length { get; set; }
    }

基本上我想在这里做的是保存这些不同元素作为子元素在其父元素下出现的顺序,将它们的位置保存在位置整数中。我能想到的唯一解决方案是使用一个静态变量来计算这些对象的实例,并使用所述变量的计数来设置位置。我想相信有一种“更清洁”的方式来处理这个问题,并希望得到任何建议。

编辑: 为了更清楚我要去哪里,我想取两个列表(因为它们是具有不同属性的不同对象)并且co 将它们转换为具有共享的另一个类基类。所以我有一个这些基类元素的列表,这些元素的排序方式与在xml中声明的相同,这样我就可以按顺序将它们绘制到屏幕上(想想一个stackpanel)。因此,如果在Xml反序列化期间可以继承,如果它们可以自动解析为基类列表,那么它也可以解决我的问题。

2 个答案:

答案 0 :(得分:1)

您正在定义组元素错误。您应该将其定义为单个列表并正确保持列表中的顺序。

列表应该是object类型(或公共基类型)。

请参阅https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute%28v=vs.110%29.aspx

答案 1 :(得分:0)

我想帮助你

  

[XmlElementAttribute(Order = 1)]

访问Controlling order of serialization in C#