【问题标题】:XML Deserializer / XSD tool / object arraysXML Deserializer / XSD 工具 / 对象数组
【发布时间】:2010-01-13 19:11:04
【问题描述】:

我有一个 XSD,并使用 xsd.exe 工具创建 c# 类。在 Web 服务中,我在 MessageContract 中接受这些创建的对象之一的实例。

这个问题的xsd相关部分在这里:

<xs:element name="Tasks">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Task" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="Task"> ... </xs:element>

xsd 创建了这个:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Tasks {

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Task")]
    public Task[] Task;
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Task { ... }

SOAPUI 从 WSDL 创建了一个如下所示的 soap 请求:

<Tasks>
  <Task>
    <Task>
      .. task data here
    </Task>
  </Task>
</Tasks>

注意额外的包装元素。尝试运行该soap 请求时,我收到反序列化错误: 行x 位置y 中的错误: 来自命名空间'ZZZ' 的'Element' 'WWW' 不是预期的。期望元素“SSS”

在生成的 SOAP 请求中找到无关节点后,我使我的新请求如下所示:

<Tasks>
  <Task>
    ...task data here
  </Task>
</Task>

现在反序列化器“工作”了,但在我的方法中,Tasks 对象包含一个空的 Task 数组。

所以我的问题是:为什么自动请求生成器会创建包装任务对象,为什么当我删除它时,我的任务对象中会出现一个空数组?

【问题讨论】:

    标签: c# wcf xsd xml-serialization serialization


    【解决方案1】:

    如果您更改类和属性名称使其不都是TaskTasks,您可能会找到答案。

    一目了然:

    <Tasks> <-- the root element for your Tasks class.  public partial class Tasks
      <Task> <-- the Task property of your Tasks class.  public Task[] Task
        <Task> <-- The first serialized task
          .. task data here
        </Task>
        <Task> <-- The second serialized task
          .. second task data here
        </Task
      </Task>
    </Tasks>
    

    查看它的另一种方法是比较您如何在Task 集合中访问Task Tasks 类:

    var myTasks = new Tasks(); // An instance of your Tasks class
    var myTasksTasks = myTasks.Task; // accessing the `Task[]` property of your `Tasks` class
    var myFirstTask = myTasks.Task[0]; // accessing the first Task instance within the Task[] array of your Tasks class
    

    【讨论】:

    • 你说的很有道理。谢谢!但是,这导致我在使用正确的 xml 时遇到反序列化错误。 元素内有几个可选元素 [minOccurs="0"]。例如: 等。省略这些元素中的任何一个都会导致反序列化错误 [期望元素 X]。您对这种情况下可能出现的问题有什么建议吗?
    • 不是我的头顶。我建议在从其他来源引入 XML 之前测试您是否可以序列化和反序列化对象。如果你能得到一个工作和不工作的样本,那么问另一个特定于该问题的问题可能会给你一个答案。
    猜你喜欢
    • 2012-07-13
    • 2010-09-12
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多