序列化对象,保留xs:group的顺序

时间:2012-04-17 06:48:18

标签: c# .net serialization xsd xml-serialization

我想使用XmlSerializer序列化对象,并希望它使用XSD中定义的顺序。

例如,我有一个带有如下元素的XSD:

...
<xs:element name="Screen" minOccurs="1" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Yaxis" minOccurs="1" maxOccurs="1" type="ab:AxisType"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
...

<xs:complexType name="AxisType">
  <xs:sequence>
    <xs:group ref="ab:IntervalSegmentGroup" minOccurs="1" maxOccurs="unbounded"/>
    <xs:element name="LastPoint" minOccurs="1" maxOccurs="1" type="ab:PointType" />
  </xs:sequence>
</xs:complexType>

<xs:group name="IntervalSegmentGroup">
  <xs:sequence>
    <xs:element name="Point" minOccurs="1" maxOccurs="1" type="ab:PointType"/>
    <xs:element name="Interpolation" minOccurs="1" maxOccurs="1" type="xs:string"/>
  </xs:sequence>
</xs:group>

<xs:complexType name="PointType">
  <xs:sequence>
    <xs:element name="Relative" type="xs:decimal" minOccurs="1" maxOccurs="1"/>
    <xs:element name="Absolute" type="xs:decimal" minOccurs="1" maxOccurs="1"/>
  </xs:sequence>
</xs:complexType>
...

然后我使用XSD.exe为此创建存根类。 然后我从这些claseses创建对象并用数据填充它们。然后我用XMLSerializer序列化它们。

我想得到的结果是这样的:

...
<Yaxis>
  <Point>
    <Relative>0</Relative>
    <Absolute>0</Absolute>
  </Point>
  <Interpolation>linear</Interpolation>
  <Point>
    <Relative>0.456</Relative>
    <Absolute>100</Absolute>
  </Point>
  <Interpolation>linear</Interpolation>
  <Point>
    <Relative>0.645</Relative>
    <Absolute>342</Absolute>
  </Point>
  <Interpolation>linear</Interpolation>
  <LastPoint>
    <Relative>1</Relative>
    <Absolute>3920</Absolute>
  </LastPoint>
</Yaxis>
...

但我得到的是:

...
<Yaxis>
  <Point>
    <Relative>0</Relative>
    <Absolute>0</Absolute>
  </Point>
  <Point>
    <Relative>0.456</Relative>
    <Absolute>100</Absolute>
  </Point>
  <Point>
    <Relative>0.645</Relative>
    <Absolute>342</Absolute>
  </Point>
  <Interpolation>linear</Interpolation>
  <Interpolation>linear</Interpolation>
  <Interpolation>linear</Interpolation>
  <LastPoint>
    <Relative>1</Relative>
    <Absolute>3920</Absolute>
  </LastPoint>
</Yaxis>
...

当我尝试针对XSD验证XML时,它将失败,因为它没有确认订单Point,Interpolation,Point ......

我做错了什么?我能以某种方式控制它吗?

1 个答案:

答案 0 :(得分:0)

尝试生成类时,可以为XSD.exe指定Order参数。

XSD.EXE。

/顺序     在所有粒子成员上生成显式订单标识符。

可能会解决您的问题。