У меня есть служба RESTful WCF, к которой я пытаюсь отправить список задач. Я нашел по другим вопросам, что вам нужно инкапсулировать список, и я это сделал, и сериализация выглядит так, как будто все идет хорошо.Deserializing Список объектов дает пустой список
XML, который приходит из сериализации список выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<MobileRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<TaskRequests xmlns="MyNameSpace">
<MobileTask>
<TaskArgs xsi:type="GetUser">
<Password>test</Password>
<UserName>t</UserName>
</TaskArgs>
<TaskID>1</TaskID>
<TaskType>GetUser</TaskType>
</MobileTask>
<MobileTask>
<TaskArgs xsi:type="GetUser">
<Password>test</Password>
<UserName>t2</UserName>
</TaskArgs>
<TaskID>2</TaskID>
<TaskType>GetUser</TaskType>
</MobileTask>
</TaskRequests>
</MobileRequest>
Так MobileRequest
класс имеет одно свойство, которое представляет собой список объектов MobileTask
. Код для MobileRequest
класса довольно прямо вперед, и выглядит следующим образом:
<Serializable(), DataContract(Name:="MobileRequest", [Namespace]:="MyNameSpace")> _
Public Class MobileRequest
<XmlArray()> <DataMember(Name:="TaskRequests")> _
Public TaskRequests As List(Of MobileTask) = New List(Of MobileTask)
Public Sub New()
Me.TaskRequests = New List(Of MobileTask)
End Sub
End Class
Класс MobileTask выглядит следующим образом:
<Serializable(), DataContract(Name:="MobileTask", [Namespace]:="MyNamespace"), _
KnownType(GetType(Obj.GetUser)), XmlInclude(GetType(Obj.GetUser))> _
Public Class MobileTask
Public Enum TypesOfTasks As Integer
Unknown = 0
GetUser = 1
End Enum
<DataMember(Name:="TaskID")> _
Public TaskID As Integer
<DataMember(Name:="TaskType")> _
Public TaskType As TypesOfTasks
<DataMember(Name:="TaskArgs")> _
Public TaskArgs As Object
End Class
тип TaskArgs изменяется в зависимости от TaskType. Я включил теги XMLInclude и KnownType для каждого возможного типа, которым может быть TaskArgs. (это может быть излишним, но я сделал это, когда что-то с сериализацией не работало и просто еще не пыталось его очистить)
Код, который я использую в своем приложении-тесте, чтобы попытаться десериализовать XML, :
Using logg As New System.IO.MemoryStream()
Using sw As New System.IO.StreamWriter(logg)
sw.Write(txtSource.Text)
sw.Flush()
If logg.Length > 0 Then
Using reader As New System.IO.StreamReader(logg)
logg.Position = 0
Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(SMS_VendorObj.MobileRequest))
Dim results = ser.Deserialize(logg)
End Using
End If
End Using
End Using
Это от простой установки Winform, что позволяет мне вставить в XML так txtSource
просто текстовое поле, что я поставил XML, я получаю от сериализации в.
Во время работы тестового приложения я могу шагнуть через приведенный выше код десериализации и после Dim results = ser.Deserialize(logg)
линии results
правильный тип, но MobileTask
список не содержит каких-либо предметов.
Я что-то пропустил в файлах классов или что-то не так с тем, как я пытаюсь десериализовать список?
Если я пропустил важный код, пожалуйста, дайте мне знать, и я обновлю все, что еще нужно. Я также отредактировал избыточные части, поэтому я, возможно, слишком много срезал, не понимая этого.
Edit: GetUser
класс:
<Serializable(), DataContract([Namespace]:="MyNamespace")> _
Public Class GetUser
<DataMember(Name:="UserName")> _
Public UserName As String
<DataMember(Name:="Password")> _
Public Password As String
End Class
Edit # 2: После обработки ошибок, что десериализатор может возможно бросить я обнаружил, что процесс десериализации бросает UnknownNode
исключение с последующим исключение UnknownElement
в строке 21, позиция 3. Подробности говорят, что ожидаемым элементом является «: TaskRequests».
Извините, не заметил, что у вас уже есть XmlInclude. Не могли бы вы показать определение типа Obj.GetUser? – BartoszKP
@BartoszKP, пожалуйста, обратитесь к редактированию. –
Вы пытались переместить атрибут 'XmlInclude' (значение' KnownType' здесь не имеет значения, поскольку оно относится к 'DataContractSerializer') к свойству' TaskArgs'? – BartoszKP