基于XSD的.Net XML序列化?

Nik*_*Nik 5 .net c# vb.net xsd xml-serialization

我一直在使用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" />
Run Code Online (Sandbox Code Playgroud)

XML是这样生成的(其中obj是我们的DataClass的一个实例):

Dim xs As New XmlSerializer(obj.GetType)
Dim xmlTextWriter As New XmlTextWriter(memoryStream, Encoding.UTF8)
xs.Serialize(xmlTextWriter, obj)
Run Code Online (Sandbox Code Playgroud)

...生成如下所示的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>
Run Code Online (Sandbox Code Playgroud)

奇怪的是,生成的XML不符合从同一个类生成的XSD.

我的问题是,有没有办法告诉XmlSerializer基于给定的XSD序列化对象?

顺便说一句,我已经看过其他修复方法:我尝试从生成的XSD重新生成类 - 这似乎有同样的问题.我可以使用XmlElement属性明确说明元素的排序,但我不喜欢为400多个公共属性做这个.

Jos*_*osh 5

不,抱歉。似乎没有任何方法可以强制XmlSerializer考虑模式。

尝试使用 xsd.exe 及其生成的架构重新生成类(进行往返转换)。

xsd.exe dataClass.xsd /classes /language:cs
Run Code Online (Sandbox Code Playgroud)

至少它可以让您深入了解 xsd.exe 命令在原始类的哪个方面遇到了问题。

也可以尝试 xsd 的替代方案:http ://xsd2code.codeplex.com/