Rid*_*Dev 1 wcf serialization generic-list
我有一个自定义DTO的列表,我试图传递给WCF服务.
我收到以下错误:
尝试序列化参数tcp:// localhost /:oObject时出错.InnerException消息是'Type'System.Collections.Generic.List`1 [[TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat.HeartBeatDTO,WFCommon,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'with data合同名称'ArrayOfHeartBeatDTO:TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat'不是预期的.将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.有关更多详细信息,请参阅InnerException.
我有DTO DataContract和DataMember集.我做了一个自动WCF服务引用,并确保执行高级选项将集合更改为通用列表而不是数组.
我错过了什么?经过很多做类似事情的网站,却无法让我的工作过去这个错误.有任何想法吗?
发件人代码:
<DataContract(Name:="HeartBeatDTO", Namespace:="TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat")> _
Public Class HeartBeatDTO
Public Sub IssuePatientReport()
SBClient.SendCommunication(_PatientID, _HeartBeats)
End Sub
Run Code Online (Sandbox Code Playgroud)
接收方代码:
Public Sub SendCommunication(ByVal sKey As String, ByVal oObject As Object) Implements iOperatorCommunication.SendCommunication
If _CurrentCommunicationLog.ContainsKey(sKey) Then
_CurrentCommunicationLog.Item(sKey) = oObject
Else
_CurrentCommunicationLog.Add(sKey, oObject)
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
我的界面:
<ServiceContract(Namespace:="tcp://localhost/")> _
<ServiceKnownType(GetType(List(Of HeartBeatDTO)))> _
Public Interface iOperatorCommunication
<OperationContract()> _
Function ReceiveCommunication(ByVal sKey As String) As Object
<OperationContract()> _
Function ReturnCommunicationLevel() As Integer
<OperationContract()> _
Function ReturnCommunications() As Dictionary(Of String, Object)
<OperationContract()> _
Function ReturnCommunicationsByKeySearch(ByVal sSearch As String) As Dictionary(Of String, Object)
<OperationContract()> _
Sub SendCommunication(ByVal sKey As String, ByVal oObject As Object)
End Interface
Run Code Online (Sandbox Code Playgroud)
更新:这是新的错误消息:
尝试序列化参数tcp:// localhost /:oObject时出错.InnerException消息是'Type'TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat.HeartBeatDTOList',数据协定名称为'HeartBeatDTOList:TEGE.ER.WorkFlowEngine.WFCommon.HeartBeat'不是预期的.不添加静态已知的已知类型的列表中的任何类型 - 例如,通过使用KnownTypeAttribute属性或将它们添加到已知类型传递给DataContractSerializer的列表".有关更多详细信息,请参阅InnerException.
如果您有自定义集合类型,则可能需要装饰具有特殊属性的类型 - 请参阅CollectionDataContract上的MSDN文档:
[CollectionDataContract]
public class CustomerList2 : Collection<string> {}
Run Code Online (Sandbox Code Playgroud)
这可能是问题吗?
更新:好的,感谢发布界面.我不是VB.NET专家,但根据我的理解和看,你在使用OperationContract属性修饰的任何方法中实际上从未使用过"HeartbeatDTO"类型 - 对吧?
所以我想你可能还必须将其定义为"ServiceKnownType" - 试试这个:
<ServiceContract(Namespace:="tcp://localhost/")> _
<ServiceKnownType(GetType(HeartBeatDTO))> _
<ServiceKnownType(GetType(List(Of HeartBeatDTO)))> _
Public Interface iOperatorCommunication
Run Code Online (Sandbox Code Playgroud)
这有帮助吗?
另外:您是否有任何特殊原因在整个服务合同中使用"对象"作为类型?你不能指定HeartbeatDTO
或者List(Of HeartbeatDTO)
?
更新:你可能尝试 - 只是为了看看它是否有效 - 创建一个新的服务接口列表:
<ServiceContract(Namespace:="tcp://localhost/")> _
Public Interface iOperatorCommunicationStripped
<OperationContract()> _
Sub SendCommunication(ByVal sKey As String, ByVal oObject As List(Of HeartbeatDTO))
End Interface
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您的服务操作是明确的数据类型,并使用HeartbeatDTO对象列表,这些对象被定义为数据协定.如果您知道为此服务合同创建客户端代理并调用该方法 - 这是否有效?
渣
归档时间: |
|
查看次数: |
5519 次 |
最近记录: |