我有一個RESTful WCF服務,我試圖發送一個任務列表。我發現在其他問題上,你必須封裝列表,我已經完成了,序列化看起來好像很順利。反序列化對象列表產生空列表
是來自序列化列表中的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的視任務類型而變化。我爲TaskArgs可能包含的每種可能類型都包含了一個XMLInclude和KnownType標記。 (這可能是矯枉過正,但我做到了,當事情與序列不工作,只是沒有試圖把它清理乾淨又)
的代碼,我用我的測試應用程序試圖反序列化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
列表不包含任何項目。
我是否在類文件中丟失了某些東西,或者我試圖反序列化列表的方式有問題嗎?
如果我錯過了重要的代碼,請讓我知道,我會更新所需的任何其他內容。我還編輯了多餘的部分,所以我可能會在沒有意識到的情況下削減太多。
編輯: 的GetUser
類:
<Serializable(), DataContract([Namespace]:="MyNamespace")> _
Public Class GetUser
<DataMember(Name:="UserName")> _
Public UserName As String
<DataMember(Name:="Password")> _
Public Password As String
End Class
編輯#2: 處理的錯誤,解串器都不可能扔我發現,反序列化過程中拋出UnknownNode
異常之後進行後一個UnknownElement
異常在第21行,位置3.細節說預期的元素是「:TaskRequests」。
對不起,沒注意到你已經有了XmlInclude。你能否顯示類型Obj.GetUser的定義? – BartoszKP
@BartoszKP請參考編輯。 –
您是否嘗試過將'XmlInclude'屬性('KnownType'與此處引用的'DataContractSerializer'無關)轉移到屬性TaskArgs? – BartoszKP