2009-10-20 41 views
5

我一直在使用XmlSerializer类序列化和反序列化.net对象,但是我们现在需要其他人来查看这些数据以对其执行一些分析。。基于XSD的.NET XML序列化?

为了帮助我们已经产生了XSD基于我们班就像这样: XSD.EXE /吨: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是我们的数据类的一个实例):

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进行序列化。 – 2009-10-21 20:42:47

+1

对不起,我不能那么做,但我确实开始将相关类复制到一个新项目中(以便将其减少到我可以发布的内容),并且令人惊讶的是,在新项目中,元素顺序XML rpoduced与架构中元素的顺序相匹配。这个项目必须有一些特定的东西强制XML按照这个顺序生成 - 任何想法都会影响到排序?关于更新代码的另一件事是,XML包含xsi:nil =“true”属性,但生成的XSD没有nillable =“true”属性 - 所以它仍然无法验证! – Nik 2009-10-23 12:40:25

回答

4

不,对不起。似乎没有任何办法可以迫使XmlSerializer考虑模式。

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

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

至少它可能会让您对xsd.exe命令遇到的原始类的哪个方面有所了解。

而且也许尝试这种替代为xsd:http://xsd2code.codeplex.com/

+0

xsd2code为我工作,而xsd.exe未能创建适当的代码,然后在序列化过程中出现一些奇怪的异常。 – AgentFire 2015-05-29 13:59:49