ProtoBuf-Azure服务结构

Kno*_*per 5 protobuf-net protobuf-csharp-port azure-service-fabric service-fabric-stateful

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

 public interface IServiceRemotingResponseMessageBody
  {
    void Set(object response);

    object Get(Type paramType);
  }
Run Code Online (Sandbox Code Playgroud)

由于实现需要可序列化,因此显而易见的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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这失败了

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

这里有解决方法吗?System.Object的没有合同,但开箱即用的DataContract串行器可以,如可以MessagePack 这里,但这些都不是系统化它可以创建时的版本头痛可靠的集合。我试过使用常见的基本类型,但Value可以是IEnumerable<T>T等。

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

Mar*_*ell 4

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

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