WCF需要抽象类上的ISerializable构造函数

时间:2014-01-09 21:02:37

标签: .net wcf

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

不确定如何回答“为什么它坚持......”这个问题,但我遇到了类似的问题(需要创建一个抽象类来发送不同的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

希望这对你有帮助。

相关问题