2017-04-02 54 views
0

我有一個WSHttpBinding的WCF服務。客戶端和服務器都在.net平臺上。無法反序列化一個wcf類對象

DataContract()> 
Public Class Task 

    <DataMember()> 
    Public Property UID As String 

    <DataMember()> 
    Public Property Name As String 

    <DataMember()> 
    Public Property progress As String 

    <DataMember()> 
    Public Property Type As Long 
    <DataMember()> 
    Public Property Version As String Version 

    <DataMember()> 
     Public Property Status As Long 
    <DataMember()> 
     Public Property Narr As String 
    <DataMember()> 
     Public Property Dt As Date 
End Class 

我打電話序列化對象,並保存到文件,以便一個功能:在Windows窗體應用程序,我調用一個函數來獲取任務,保存任務的文件,後來,因爲加載任務那以後,可以很容易地裝載到作爲對象:

Function GetSaveTask() 
    Dim Task_ As serv.Task = ServObj.GetTask() '' Calling Service to get Task 
    Dim ObStrng As String = Jserialize(Task_) 
    File.WriteAllText("D:\Task.ini", ObStrng) 
End Function 
Function LoadTask() 
    Dim Task_ As serv.Task 
    Dim ObStrng As String = File.ReadAllText("D:\Task.ini") 
    Task_ = Deserialize(Of serv.Task)(ObStrng) 

End Function 
Public Shared Function Jserialize(Of T)(ByVal obb As Object) As Object 
    Dim serializer As New Web.Script.Serialization.JavaScriptSerializer() 
    Return serializer.Serialize(obb) 
End Function 
Public Function Deserialize(Of T)(ByVal obb As String) As Object 
    Dim JavaScriptSerializer As New Web.Script.Serialization.JavaScriptSerializer() 
    Return JavaScriptSerializer.Deserialize(Of T)(obb) 
End Function 

串行化的數據在Task.ini:

[{"ExtensionData":{},"Dt":"\/Date(1490985000000)\/","Name":"Task-2017", 
"Narr":null,"Status":20,"Type":0,"UID":"ABBB-KKKK","Version":"1.0.1.2","progress":20}] 

我只能用System.Web.Script.Serialization.JavaScriptSerializer。該Task_可以輕鬆序列化並保存到文件。但LoadTask()無法反序列化,並拋出一個錯誤:

的類型定義無參數的構造函數「System.Runtime.Serialization.ExtensionDataObject」

我試圖創建一個代理類與類任務相同,並將其保存到文件。但服務不斷更新DataMember。我們只更新服務參考,一切正常。所以代理類將是一個開銷,並且必須隨着服務類的變化而不斷更新(這在整個項目中是不可能的)。

爲什麼無法反序列化?有沒有辦法加載除ExtensionData之外的所有內容?

回答

1

ExtensionData導致該錯誤。 ExtensionData實際上是一個必須構建到類型中以啓用往返的功能。它始終由DataContractSerializer發出。正如你所說的,服務不斷更新,你可以做的一件事是,每次更新服務引用時,評論ExtensionData及其實現。

<System.NonSerializedAttribute()> _ 
Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject 

,並刪除Implements

Implements System.Runtime.Serialization.IExtensibleDataObject