【问题标题】:ProtoBuf - Azure Service FabricProtoBuf - Azure 服务结构
【发布时间】:2018-06-23 16:28:23
【问题描述】:

我正在考虑替换 ASF 中 RPC 的默认序列化程序。这涉及实现一些接口,其中一个在通过 RPC 通信的服务之间传递

 public interface IServiceRemotingResponseMessageBody
  {
    void Set(object response);

    object Get(Type paramType);
  }

由于实现需要可序列化,显而易见的 ProtoBuf 实现类似于

    [ProtoContract]
    public class ProtoBufRemotingResponseBody : IServiceRemotingResponseMessageBody
    {
        [ProtoMember(1)]
        public object Value { get; set; }

        public void Set(object response)
        {
            Value = response;
        }

        public object Get(Type paramType)
        {
            return Value;
        }
    }

不幸的是,这失败了

没有为类型定义序列化程序:System.Object

这里有解决方法吗? System.Object 没有合同,但 OOTB DataContract 序列化程序可以,MessagePack here 也可以,但是这些没有被模式化,这在使用 reliable collections 时会产生版本控制问题。我尝试过使用通用的基本类型,但 Value 可以是 IEnumerable<T>T 等。

有人可以帮忙吗? 谢谢, KH

【问题讨论】:

    标签: azure-service-fabric protobuf-net service-fabric-stateful protobuf-csharp-port


    【解决方案1】:

    目前,protobuf-net 对object 没有很好的支持,除了一些杂乱无章的黑客攻击。最简单的尝试(只是看看它是否适用于您的场景)是在该 proto-member 属性上找到“动态类型”标志并将其设置为 true。这种特定于库的 hack 将一些类型元数据刻录到数据中,以使其能够处理未知类型,但它远非完美。

    这里的“更好”修复需要我找到时间来实现“任何”功能(最近才添加到 Google 库中,大约在 proto3 IIRC 的时候)。这大致类似,但将以跨库的方式实现。

    【讨论】:

    • 嗨,马克,非常感谢您的回复。我实际上已经尝试过了,并收到了错误'Dynamic type is not a contract-type: List`1'
    • @KnowHoper 是的,列表和单个对象之间存在一些非常关键的区别。即使在 proto3 术语中,这也是 repeated Anyoptional Any 之间的重要区别;我没有任何简单的解决方法。我可以make List<T> 使用动态类型功能,但这将是微不足道的,我今天不能为您提供。如果您可以取消选择数据并切换到 List<object>,它可能会有所帮助 - 但我还没有检查过!
    • 好的,马克,非常感谢您的回复。我还有其他一些途径可以探索。一切顺利。
    • @KnowHoper 你有解决方案吗?
    猜你喜欢
    • 2015-12-04
    • 2016-04-16
    • 2020-05-12
    • 1970-01-01
    • 2016-12-04
    • 2017-03-30
    • 2016-08-23
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多