ProtoBuf - Azure Service Fabric

时间:2018-01-15 02:32:38

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

我正在寻找替换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时产生版本控制问题。我尝试使用公共基本类型,但值可以是IEnumerable<T>T等。

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

1 个答案:

答案 0 :(得分:3)

目前,protobuf-net对object没有很好的支持,除非是通过一些混乱的黑客攻击。最简单的尝试(只是为了查看它是否适用于您的场景)是在该proto-member属性上找到“dynamic types”标志并将其设置为true。这个特定于库的黑客将某些类型的元数据刻录到数据中,以允许它与未知类型一起工作,但它远非完美。

这里的“更好”解决方法将让我找到时间来实现“任何”功能(相对于最近,在proto3 IIRC时添加到Google库中)。这大致类似,但将以跨库方式实现。