XML десериализатор / инструмент XSD / массивы объектов - PullRequest
1 голос
/ 13 января 2010

У меня есть XSD, и я использовал инструмент xsd.exe для создания классов c #. В веб-сервисе я принимаю в 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, который выглядит следующим образом:

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

обратите внимание на дополнительный элемент-обертку. При попытке выполнить этот запрос мыла, я получаю ошибку десериализации: Ошибка в строке x, позиция y: «Элемент» «WWW» из пространства имен «ZZZ» не ожидается. Ожидаемый элемент 'SSS'

После нахождения постороннего узла в сгенерированном SOAP-запросе мой новый запрос выглядел так:

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

Теперь десериализатор «работает», но в моем методе объект Tasks содержит пустой массив Task.

Итак, мой вопрос: почему автоматический генератор запросов создает объект-задачу-обертку и почему при его удалении я получаю пустой массив в своем объекте-задаче?

1 Ответ

1 голос
/ 13 января 2010

Вы можете найти свой ответ, если измените имена классов и свойств, чтобы они не все Task и Tasks.

С первого взгляда:

<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
...