【问题标题】:WCF requires ISerializable constructor on abstract classWCF 需要抽象类上的 ISerializable 构造函数
【发布时间】:2014-01-09 21:02:37
【问题描述】:

我正在从 Remoting 转换为 WCF。我的代码进行了很多优化,以最大限度地减少通过网络发送的数据量 - 因此我使用的是 ISerializable。作为升级的一部分,我不想更改为使用内置序列化 - 工作已经完成,所以只想继续使用它。

WCF 将尊重并使用 ISerializable 但是,如果我有一个抽象类“fruit”,它被标记为 ISerializable,然后是具体类 apple、banana 和 pear,当 WCF 尝试反序列化时它会抱怨:

“在ISerializable类型'fruit'中找不到带参数的构造函数(SerializationInfo, StreamingContext)。”

虽然它不需要构造函数!这是一个 abstract 类,这个构造函数只能从子类调用:mybase.new(info,context)。而且我的子类不需要。

为什么要坚持一个永远不会被调用的构造函数?

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    不知道如何回答“为什么坚持...”这个问题,但我确实遇到了类似的问题(需要创建一个抽象类来发送不同的 obj 定义),这就是我想出的.

    我在 Web 服务的两端(主机和客户端)都使用一个简单的基本类作为输入和输出参数。该类只有两个参数,一个 byte() 参数和一个字符串参数。基于这两个参数,我可以有效地发送每个可以想象的数据结构,将任何文本或数字数据包装到字符串参数(如 xml)中,并将任何字节数据包装到此类的字节字段中。

    由于这种“包装”是经过编程的,我可以从主机到客户端或客户端到主机发送无数不同的数据对象,而无需更改 Web 服务接口……数据和操作类.

    Web 服务公开的每个“方法”,从简单的 Ping() 函数到最复杂的 ResumeDownload() 函数,都使用相同的基本类来发送执行函数所需的字节和参数,并返回结果.

    我使用的基本类(请原谅 VB)如下:

     Partial Public Class MessageStructure
         Inherits Object
         Implements System.Runtime.Serialization.IExtensibleDataObject, IDisposable
         Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
         Private BodySectionField() As Byte
         Private TextSectionField As String
    
         Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
          Get
              Return Me.extensionDataField
          End Get
          Set(value As System.Runtime.Serialization.ExtensionDataObject)
              Me.extensionDataField = value
          End Set
         End Property
    
         <DataMember(Order:=1)> _
         Public Property BodySection() As Byte()
           Get
             Return Me.BodySectionField
           End Get
           Set(value As Byte())
             Me.BodySectionField = value
           End Set
         End Property
    
         <DataMember(Order:=0)> _
         Public Property TextSection() As String
            Get
               Return Me.TextSectionField
            End Get
            Set(value As String)
               Me.TextSectionField = value
            End Set
         End Property
    
         Public Sub New(ByVal text As String, ByVal Bytes As Byte())
            BodySectionField = Bytes
            TextSectionField = text
         End Sub
    End Class
    

    希望这对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2015-03-20
      • 2015-10-15
      • 2019-11-18
      • 2018-02-27
      相关资源
      最近更新 更多