【问题标题】:Adding protobuff-net serialization to WCF through code with knowntypes通过已知类型的代码将 protobuff-net 序列化添加到 WCF
【发布时间】:2011-05-23 20:09:07
【问题描述】:

我目前在代码中定义了我的所有 WCF 连接,并且我试图硬塞 protobuff-net 序列化,但收效甚微。我的所有合约都没有标记 knowntype 属性,因为我们有一个带有有效负载的基本消息(它将是几十个 knowntypes)。我们找出我们拥有的已知类型并将它们缓存在派生自 DataContractSerializerOperationBehavior 的类中。然后在重写的 CreateSerializer 函数中,我将缓存的已知类型传递给 DataContractSerializer,如下所示

 public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns,   IList<Type> knownTypes)
 {
          new DataContractSerializer(type, name, ns, m_Known ?? knownTypes, 0x7FFF, ...)
 }

有没有办法将已知类型的列表传递给 protobuf-net 序列化程序。我意识到 protobuf-net 并不是要镜像 WCF 的序列化程序,但如果它们遵循允许覆盖 knowntypes 列表的模式会很好。感谢您的帮助。

但是我没有选择以这种方式处理 Protobuf-net 序列化程序(我查看了 ProtoOperationBehavior)。有没有在

中指定的已知类型

【问题讨论】:

    标签: wcf protobuf-net


    【解决方案1】:

    在“v2”中,可用的子类型可以在运行时通过.AddSubType(...) 动态定义(针对 RuntimeTypeModel)(事实上,所有属性现在仅作为类型模型的默认配置,它可以以任何方式配置)。

    但是,我应该强调 v2 目前处于 beta 中,并且作为 noted in the blog,WCF 挂钩目前不包含在 beta 中,纯粹是在我完成验证时等等。但是,我希望您的设置如问题中所示,它应该是微不足道的(这只是将模型传递到提供的XmlObjectSerializer 实现的情况)。

    【讨论】:

    • 嗨,马克,感谢您的快速回复。我已经下载了当前的 depot,至少使用当前的代码我认为我会遇到一些问题(我不确定这是否是 v2 in downloads 的基础)。我无法自己创建序列化程序,因为 XmlProtoSerializer 对程序集是私有的(您可以通过反射访问它),并且我不能从 ProtoOperationBehavior 派生为其内部和密封。如果其中任何一个是错误的,我可以将其放入,但我无法弄清楚它是如何工作的。
    • @Steve - 是的,这与整个“当我完成验证”相关联;p 听起来确实像公开 XmlProtoSerializer(构造函数采用类型模型)是最实用的选项。我很高兴 WCF 的故事很好,这就是为什么在 beta 的第一滴中没有正式宣布 WCF 挂钩。我可能可以在下一个 drop 中包含 XmlProtoSerializer 的东西
    • @Marc,哈哈,我不明白你所说的钩子是什么意思。对不起。如果我可以提出一个小功能请求,那么能够在构造函数中打开保留对象引用会很好,这是一个非常不方便在 WCF 文档中追踪的功能。出于好奇,默认打开该功能是否昂贵?感谢所有的帮助,我真的很感激。
    • @Steve 的主要问题是它需要我从任何平台之间远程移植的任何东西上走很长 的路。对于一个不相关的问题,我正在尝试添加“这种类型应始终被视为参考”——这就足够了吗?
    • @Marc - 是的,这行得通。我之所以建议它,是因为我花了一天多的时间才找到我的数据合同中的错误。我有一个通用的树结构,其中每个节点都有对未被 WCF 序列化的父级的引用。最糟糕的部分是 WCF 跟踪特别没有帮助。最后,我得到了一个通道错误,其中包含有关反序列化引用的特定错误消息。对于追踪错误的难度有多大,我原以为 MS 会将其设为默认值,除非它真的很贵。我相信 MS 也有一个“类型作为参考”属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2010-09-19
    相关资源
    最近更新 更多