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多个公共属性做这个.
不,抱歉。似乎没有任何方法可以强制XmlSerializer考虑模式。
尝试使用 xsd.exe 及其生成的架构重新生成类(进行往返转换)。
xsd.exe dataClass.xsd /classes /language:cs
Run Code Online (Sandbox Code Playgroud)
至少它可以让您深入了解 xsd.exe 命令在原始类的哪个方面遇到了问题。
也可以尝试 xsd 的替代方案:http ://xsd2code.codeplex.com/
| 归档时间: |
|
| 查看次数: |
8147 次 |
| 最近记录: |