0

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

那么,我该如何解决呢?

4

1 回答 1

0

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

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

于 2013-07-11T11:38:05.903 回答