我一直在使用 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 多个公共(public)属性这样做。
最佳答案
不,对不起。似乎没有任何方法可以强制 XmlSerializer
考虑架构。
尝试使用 xsd.exe 及其生成的模式重新生成类(进行往返转换)。
xsd.exe dataClass.xsd /classes /language:cs
至少它可以让您深入了解 xsd.exe 命令在原始类的哪些方面存在问题。
也可以试试这个 xsd 的替代品:http://xsd2code.codeplex.com/
关于c# - 基于 XSD 的 .Net XML 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1593738/