Проблемы с десериализацией XML в свойствах объекта заканчиваются нулевым - PullRequest
0 голосов
/ 08 ноября 2018

Я работаю над обработкой ответа от вызова веб-службы SOAP. Когда метод в клиентском объекте пытается десериализовать ответ, это ничто.

Я настроил тест для эмуляции процесса десериализации, но все еще не могу получить значения для IsSuccess и Message для заполнения в объекте.

Пожалуйста, помогите мне определить, чего не хватает, чтобы процесс десериализации полностью десериализовал xml в соответствующий объект. Код контракта генерируется автоматически с использованием svcutil.

РЕДАКТИРОВАТЬ: я могу манипулировать xml по мере необходимости с messageinspector, поэтому, если проблема связана с xml, мне просто нужно выяснить, что изменить.

Условия договора:

<System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.33440"),
 System.SerializableAttribute(),
 System.Diagnostics.DebuggerStepThroughAttribute(),
 System.ComponentModel.DesignerCategoryAttribute("code"),
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True, [Namespace]:="Green:EggsandHam.wsdll")>
Partial Public Class NumberResponse

    Private isSuccessField As String

    Private messageField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute(Order:=0)>
    Public Property IsSuccess() As String
        Get
            Return Me.isSuccessField
        End Get
        Set(value As String)
            Me.isSuccessField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute(Order:=1)>
    Public Property Message() As String
        Get
            Return Me.messageField
        End Get
        Set(value As String)
            Me.messageField = value
        End Set
    End Property
End Class


<System.Diagnostics.DebuggerStepThroughAttribute(),
 System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0"),
 System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced),
 System.ServiceModel.MessageContractAttribute(IsWrapped:=False)>
Partial Public Class NumberResponse1

    <System.ServiceModel.MessageBodyMemberAttribute([Namespace]:="Green:EggsandHam.wsdl", Order:=0)>
    Public NumberResponse As NumberResponse

    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub New(ByVal NumberResponse As NumberResponse)
        MyBase.New()
        Me.NumberResponse = NumberResponse
    End Sub
End Class

Тест:

Imports System.IO
Imports System.Text
Imports System.Xml.Serialization

Module Module1

    Sub Main()
        Dim u As New NumberResponse1()
        u = Deserialize(Of NumberResponse1)(XElement.Load("C:\test\number.xml"))
        Console.WriteLine(u.NumberResponse.Message)
    End Sub

    Public Function Deserialize(Of T)(ByVal xElement As XElement) As T
        Using memoryStream As New MemoryStream(Encoding.ASCII.GetBytes(xElement.ToString()))
            Dim xmlSerializer As New XmlSerializer(GetType(T))
            Return xmlSerializer.Deserialize(memoryStream)
        End Using
    End Function

End Module

XML:

<?xml version="1.0" encoding="utf-8"?>
<NumberResponse1>
    <NumberResponse>
        <ns1:NumberResponse xmlns:ns1="Green:EggsandHam.wsdl">
            <ns1:IsSuccess>true</ns1:IsSuccess>
            <ns1:Message>number processed successfully.</ns1:Message>
        </ns1:NumberResponse>
    </NumberResponse>
</NumberResponse1>

Выход:

enter image description here

1 Ответ

0 голосов
/ 09 ноября 2018

Я выяснил проблему с помощью обратного инжиниринга, я сериализовал классы в xml. Новый xml в итоге выглядел так:

<?xml version="1.0" encoding="utf-8"?>
<NumberResponse1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <NumberResponse>
        <IsSuccess xmlns="Green:EggsandHam.wsdl">True</IsSuccess>
        <Message xmlns="Green:EggsandHam.wsdl">your father smelt of elderberries</Message>
    </NumberResponse>
</NumberResponse1>

Отсутствует пространство имен xmlschema.

...