我正在从Remoting转换为WCF。我的代码中有很多优化,以最大限度地减少通过线路发送的数据量 - 因此我使用的是ISerializable。作为升级的一部分,我不想改为使用内置序列化 - 工作已经完成,所以只想继续使用它。
WCF将尊重并使用ISerializable,但是如果我有一个标记为ISerializable的抽象类“fruit”,那么当WCF尝试反序列化它时,具体类为apple,banana和pear抱怨:
“在ISerializable类型'fruit'中找不到带参数的构造函数(SerializationInfo,StreamingContext)。”
虽然它不需要构造函数!它是一个抽象类,这个构造函数只能从子类调用:mybase.new(info,context)。而我的子类不需要。
为什么它坚持一个永远不会被调用的构造函数?
答案 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
希望这对你有帮助。