我有使用wcf的项目。目前它使用NetDataContractSerializer。我想迁移到protobuf-net。我的服务有以下合同:
interface IRemotingServer
{
[OperationContract]
TypeConfig GetTypeConfig(string typename);
[OperationContract]
object ExecuteMethod(InstanceIdentifier instance, string methodName, object[] parameters);
[OperationContract]
object ExecuteGenericMethod(InstanceIdentifier instance, string methodName, object[] parameters, string[] genericTypes, string returnType);
[OperationContract]
object GetRemoteProperty(InstanceIdentifier instance, string propertyName);
[OperationContract]
void SetRemoteProperty(InstanceIdentifier instance, string propertyName, object value);
[OperationContract]
ObjectDataPacket GetObject(InstanceIdentifier instance);
[OperationContract]
bool Connect();
[OperationContract]
bool Disconnect();
}
事情顺利,直到我尝试调用我的合同的GetRemoteProperty方法,返回类型是对象。使用我发现的服务器跟踪,该服务器随着下面的消息而爆炸
尝试序列化参数http://www.mersoft.am/Remoting:GetRemotePropertyResult时出错。 InnerException消息是'Type'Mersoft.Remoting.InstanceIdentifier []',数据协定名称为'ArrayOfInstanceIdentifier:Mersoft.Remoting'不是预期的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。有关详细信息,请参阅InnerException。
那么,我该如何解决呢?
答案 0 :(得分:0)
基本上,对于任何不是object
或BinaryFormatter
的序列化程序,返回NetDataContractSerializer
将是一个巨大的问题。返回object
只是不起作用并且在通用WCF边界上不合适。 protobuf-net与大多数序列化程序(包括DataContractSerializer
,XmlSerializer
,JSON.NET等)一样,希望了解的不仅仅是object
;简单地说,在大多数情况下,不足以反序列化的信息。
只要你返回object
,这就不能与protobuf-net(或者,如上所述,大多数序列化程序)一起使用。目前,ProtoOperationBehavior
继承自DataContractSerializerOperationBehavior
;一种可能的选择是编写一个默认为NetDataContractSerializer
而不是DataContractSerializer
的版本 - 这意味着NetDataContractSerializer
将序列化未知类型;当然,它仍然不会使用protobuf-net用于object
,,因为它不能。