2014-01-09 36 views
0

我正在将Remoting转换为WCF。我的代码有很多优化,以最大限度地减少通过线路发送的数据量 - 因此我使用了ISerializable。作为升级的一部分,我不想更改为使用内置序列化 - 已完成的工作只是想继续使用它。WCF需要抽象类上的ISerializable构造函数

WCF将荣誉和使用ISerializable的但是如果我有一个抽象类,“水果”,它被标记为ISerializable的,然后具体的类苹果,香蕉和梨时WCF试图做反序列化抱怨:

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

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

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

回答

0

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

我使用一个简单的,基本类的web服务(主机和客户机)作为输入和输出参数的两侧。该类只有两个参数,一个byte()参数和一个字符串参数。基于这两个参数,我可以有效发送每一个可以想象的数据结构,包裹任何文本或数字数据转换成字符串参数(如XML)和包装任何字节数据到这个类的字节字段。

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

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

基本类别I(原谅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 

希望这可以帮助你。