ProtoBuf - Azure Service Fabric

5

我正在考虑替换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 在这里也可以,但这些都没有进行模式化,这会在使用可靠集合时创建版本控制问题。我尝试过使用公共基础类型,但Value可以是IEnumerable<T>T等。

有人能帮忙吗? 谢谢, KH

1个回答

4
目前,protobuf-net不支持object的良好支持,除非通过一些混乱的方法。最简单的尝试(只是为了查看它是否适用于您的情况)是在proto-member属性中找到“dynamic types”标志,并将其设置为true。这种特定于库的hack会将一些类型元数据烧入数据中,以使其能够与未知类型一起使用,但远非完美。
更好的解决方法涉及我花时间实现“ any”功能(在Google库中相对较新添加,大约是在proto3时期)。这个功能的工作方式类似,但会以跨库的方式实施。

嘿,马克,非常感谢你的回复。我实际上已经尝试过了,但是收到了错误信息“'Dynamic type is not a contract-type: List`1'”。 - KnowHoper
@KnowHoper,是的,列表和单个对象之间有一些非常关键的区别。即使在proto3术语中,这也是“重复任何”和“可选任何”之间的重要区别;我没有任何简单的解决方法。我可能可以通过使用动态类型功能来使List<T>工作,但这将是微不足道的,并且我今天无法为您提供此服务。如果您可以拆分数据并切换到List<object>,那可能会有所帮助-但我还没有检查过! - Marc Gravell
好的Marc,非常感谢你的回复。我还有其他几个途径要探索。祝一切顺利。 - KnowHoper
@KnowHoper,你有解决这个问题的方案吗? - Kien Chu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接