XML Deserializer / XSD工具/对象数组

时间:2010-01-13 19:11:04

标签: c# wcf xsd xml-serialization serialization

我有一个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的错误:'Element''WWW'来自名称空间'ZZZ'不是预期的。期待元素'SSS'

在生成的SOAP请求中找到无关节点后,我将新请求看起来如下:

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

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

所以我的问题是:为什么自动请求生成器创建包装器Task对象,为什么当我删除它时,我在Tasks对象中得到一个空数组?

1 个答案:

答案 0 :(得分: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