2017-04-02 7 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上で私のようにそのタスクをロードし、後に、タスクを取得し、ファイルにそのタスクを保存する機能を呼び出していたアプリケーションを形成その後に、それは簡単としてオブジェクトにロードすることができます。Task.iniで

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 

シリアライズされたデータ:

[{"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を使用することができます。 タスク_は簡単にシリアライズしてファイルに保存できます。しかし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 
関連する問題