Ошибка десериализации XmlArrayItem с вложенными элементами - PullRequest
0 голосов
/ 27 октября 2009

Я совершенно новичок в сериализации и буду очень признателен за любую помощь.

У меня проблемы с десериализацией ответного сообщения, полученного от прокси-класса, созданного мной через WSDL.exe. Я считаю, что проблема заключается в том, что я использую XmlArrayItem, в который вложены элементы.

Вместо получения:

<results xmlns="urn:partner.soap.company.com">
    <result>
        <created>false</created>
        <id>0018000000ZqV8DAAV</id>
        <success>true</success>
     </result>
     <result>
        <created>false</created>
        <id>0018000000ZqVMAAA3</id>
        <success>true</success>
     </result>
</results>

Я получаю следующее в коде:

created(0):false
id(0): false 0018000000ZqV8DAAV
success(0):false 0018000000ZqV8DAAVtrue

created(1):false 0018000000ZqV8DAAVtruefalse
id(1): false 0018000000ZqV8DAAVtruefalse0018000000ZqVMAAA3
success(1): false 0018000000ZqV8DAAVtruefalse0018000000ZqVMAAA3true

Похоже, что ответ просто добавляет следующую часть сообщения, не убирая ничего, что было ранее.

Вот основная функция, которая вызывает веб-сервис:

 <System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use:=System.Web.Services.Description.SoapBindingUse.Literal, _
    ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Bare)> _
    Public Function Provide_Service(<System.Xml.Serialization.XmlElement([Namespace]:="http://www.company.com/connectors/request/129/")> _
    ByVal USIUpdates As USIUpdates) As _
    <System.Xml.Serialization.XmlArray("results", IsNullable:=False, [Namespace]:="urn:partner.soap.sforce.com"), _
    System.Xml.Serialization.XmlArrayItem("result", IsNullable:=False)> UpsertResult()

        Dim results() As Object = Me.Invoke("Provide_Service", New Object() {USIUpdates})
        Return CType(results(0), UpsertResult())
    End Function

А вот класс, который генерирует ответ:

<System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42"), _
 System.SerializableAttribute(), _
 System.Diagnostics.DebuggerStepThroughAttribute(), _
 System.ComponentModel.DesignerCategoryAttribute("code"), _
 System.Xml.Serialization.XmlTypeAttribute([Namespace]:="urn:partner.soap.company.com")> _
Partial Public Class UpsertResult

    'Public ReturnResponseItems As [ResponseItems]

    Private createdField As String

    Private errorsField() As [Error]

    Private idField As String

    Private successField As String

    '''<remarks/>
    Public Property created() As String
        Get
            Return Me.createdField
        End Get
        Set(ByVal value As String)
            Me.createdField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("errors")> _
    Public Property errors() As [Error]()
        Get
            Return Me.errorsField
        End Get
        Set(ByVal value As [Error]())
            Me.errorsField = value
        End Set
    End Property

    '''<remarks/>
    <XmlElementAttribute(isnullable:=True)> _
    Public Property id() As String
        Get
            Return Me.idField
        End Get
        Set(ByVal value As String)
            Me.idField = value
        End Set
    End Property

    '''<remarks/>
    Public Property success() As String
        Get
            Return Me.successField
        End Get
        Set(ByVal value As String)
            Me.successField = value
        End Set
    End Property
End Class

Буду признателен за любые идеи или советы о том, как с этим справиться.

1 Ответ

0 голосов
/ 30 октября 2009

В случае, если у кого-то еще есть эта проблема, вот решение. По какой-то причине при запуске WSDL.exe атрибут XMLArrayItemAttribute неправильно указывал на класс, содержащий массивы внутри.

Таким образом, в XMLArrayItemAttribute необходимо добавить следующее в основной функции:

Type:=GetType(UpsertResult)

, который выглядит следующим образом:

System.Xml.Serialization.XmlArrayItemAttribute("result", IsNullable:=False, Type:=GetType(UpsertResult))

...