c# - 基于 XSD 的 .Net XML 序列化?

标签 c# .net 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" />

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/

相关文章:

c# excel在excel工作表上创建一个按钮

c# - 在 MvxFragment 中通过 Id 查找

vb.net - VB.NET 中带有文本框的 FolderBrowser

vb.net - 锁定 MSChart 网格线

c# - 对多个任务使用 async/await

c# - 将 XElement 合并到 XDocument 中并解析 namespace

c# - ASP.NET 中有多少种类型的 Http Handler

c# - 无法将类型为 'System.Web.Hosting.SimpleWorkerRequest' 的对象转换为类型 'System.Web.Hosting.IIS7WorkerRequest'

.net - f#:已编译程序中的 windows 窗体

c# - 可以赋值null吗?