使用WCF进行Protobuf类型继承

时间:2014-07-03 16:11:33

标签: wcf protobuf-net

我们在使用protobuf-net类型继承时遇到了麻烦。

我们有这样一个基类:

[DataContract, ProtoContract]
public abstract class BaseClass : IBase
{
protected IBase()
{
    RequestUID = Guid.NewGuid();
}

[DataMember(Order = 8000), ProtoMember(8000)]
public Guid ID { get; set; }

[DataMember(Order = 8001), ProtoMember(8001)]
public string User { get; set; }

}

继承自BaseClass的类。

[DataContract, ProtoContract]
public class ConcreteClass : BaseClass
{
[DataMember(Order = 4), ProtoMember(4)]
public int? WorkItemId { get; set; }
}

(将来我们将只使用ProtoMember和ProtoContract。)

当客户端和服务器启动时,我们会在两种环境中都执行以下操作:

RuntimeTypeModel.Default[typeof(BaseClass)].AddSubType(50, typeof(ConcreteClass));

现在,当我们将ConcreteClass的实例传递给WCF服务操作时,我们会得到例外:

  • BaseClass不提供公共构造函数。 (选择用于反序列化的错误类型)
  • 或者,如果我们为BaseClass提供公共构造函数,它会尝试将BaseClass对象强制转换为服务器上的ConcreteClass。 (再次错误的类型)
  • 在某些特殊情况下(我们并不确切知道何时发生这种情况)Protobuf会尝试从 OtherConcreteClass 反序列化为 ConcreteClass

我们做错了什么? WCF行为正确注册。我们对简单类没有问题(没有继承)。

是否有文档如何为WCF场景正确配置继承?

由于

0 个答案:

没有答案