protobuf-net作为带有OperationContract中对象的wcf序列化程序

时间:2013-07-11 11:30:42

标签: wcf protobuf-net netdatacontractserializer

我有使用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。

那么,我该如何解决呢?

1 个答案:

答案 0 :(得分:0)

基本上,对于任何不是objectBinaryFormatter的序列化程序,返回NetDataContractSerializer将是一个巨大的问题。返回object只是不起作用并且在通用WCF边界上不合适。 protobuf-net与大多数序列化程序(包括DataContractSerializerXmlSerializer,JSON.NET等)一样,希望了解的不仅仅是object;简单地说,在大多数情况下,足以反序列化的信息。

只要你返回object,这就不能与protobuf-net(或者,如上所述,大多数序列化程序)一起使用。目前,ProtoOperationBehavior继承自DataContractSerializerOperationBehavior;一种可能的选择是编写一个默认为NetDataContractSerializer而不是DataContractSerializer的版本 - 这意味着NetDataContractSerializer将序列化未知类型;当然,它仍然不会使用protobuf-net用于object,因为它不能