基于XSD的.Net XML序列化?

6

我一直使用XmlSerializer类对.NET对象进行序列化和反序列化,没有问题,但现在我们需要让其他人查看数据以执行一些分析。

为了帮助这个过程,我们基于我们的类创建了一个XSD,命令如下:

xsd.exe /t:DataClass Assembly.exe

XSD的开头看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="DataClass" nillable="true" type="DataClass" />
  <xs:complexType name="DataClass">
    <xs:complexContent mixed="false">
      <xs:extension base="BaseDataClass">
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" name="StudyID" type="xs:string" />
          <xs:element minOccurs="1" maxOccurs="1" name="Position" type="xs:int" />
          <xs:element minOccurs="1" maxOccurs="1" name="IViewer" type="xs:string" />

XML是这样生成的(其中obj是我们DataClass的一个实例):
Dim xs As New XmlSerializer(obj.GetType)
Dim xmlTextWriter As New XmlTextWriter(memoryStream, Encoding.UTF8)
xs.Serialize(xmlTextWriter, obj)

...生成如下所示的XML:

<?xml version="1.0" encoding="utf-8"?>
<DataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Version>SixMonthQ-E1</Version>
    <IViewer xsi:nil="true" />
    <Language xsi:nil="true" />
    ...
    <StudyID>12345</StudyID>

令人惊奇的是,生成的XML与从同一类生成的XSD不一致。
我的问题是,有没有办法告诉XmlSerializer根据给定的XSD序列化对象?
另外,我已经尝试了其他修复方法: 我尝试从生成的XSD重新生成类-这似乎有同样的问题。 我可以使用XmlElement属性显式地指定元素的顺序,但我不想对400多个公共属性这样做。

1
请发布类的详细信息和完整的XSD。它应该始终根据相同的XSD进行序列化。 - John Saunders
1
抱歉,我不能这样做,但我已开始将相关类复制到一个新项目中(以便将其缩减为可以发布的内容),令人惊讶的是,在新项目中,XML 中元素的顺序与模式中元素的顺序匹配。一定有一些特定于该项目的东西强制要求按那个顺序生成 XML - 你有什么想法能影响顺序吗?更新后的代码另一件事是,XML 包含 xsi:nil="true" 属性,但生成的 XSD 没有 nillable="true" 属性 - 因此仍然无法通过验证! - Nik
1个回答

5

抱歉,似乎没有强制XmlSerializer考虑模式的方法。

尝试使用xsd.exe和生成的模式重新生成类(进行往返转换)。

xsd.exe dataClass.xsd /classes /language:cs

至少这可能会让您了解xsd.exe命令在原始类的哪个方面遇到了问题。

另外,也可以尝试使用xsd的替代方案:http://xsd2code.codeplex.com/


xsd2code 对我很有效,而 xsd.exe 则无法创建适当的代码,导致在序列化过程中出现了一些奇怪的异常。 - AgentFire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接