【问题标题】:unable to Deserialize a wcf Class object无法反序列化 wcf 类对象
【发布时间】:2017-04-02 08:40:34
【问题描述】:

我有一个带有 WSHttpBinding 的 WCF 服务。客户端和服务器都在.net 平台上。在 Windows 窗体应用程序上,我正在调用一个函数来获取任务并将该任务保存在一个文件中,稍后将该任务加载为:

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

我正在调用一个序列化对象并保存到文件的函数,以便以后可以轻松地将其加载到对象中:

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”类型定义无参数构造函数

我已尝试创建一个与 ClassTask 相同的代理类,并将其保存到文件中。但该服务不断更新 DataMember。我们只需更新服务参考,一切正常。所以代理类将是一个开销,并且必须随着服务类的变化而不断更新(这在整个项目中是不可能的)。

为什么无法反序列化?除了 ExtensionData,有什么方法可以全部加载吗?

【问题讨论】:

    标签: .net json winforms wcf serialization


    【解决方案1】:

    ExtensionData 导致该错误。 ExtensionData 实际上是一个必须内置到类型中才能启用往返的功能。它始终由 DataContractSerializer 发出。正如您所说,服务不断更新,您可以做的一件事是,每次更新服务引用时,评论 ExtensionData 及其实现。

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

    并删除Implements

    Implements System.Runtime.Serialization.IExtensibleDataObject
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2017-06-04
      • 2014-08-04
      • 2015-05-29
      • 1970-01-01
      • 2021-02-08
      相关资源
      最近更新 更多