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 没有合同,但 OOTBDataContract序列化程序可以,这里的MessagePack 也可以,但是这些不是模式化的,这在使用可靠集合时会产生版本控制问题。我尝试过使用通用的基本类型,但 Value 可以是or等​​等。IEnumerable<T>T

任何人都可以帮忙吗?谢谢,KH

4

1 回答 1

4

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

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

于 2018-01-15T08:22:28.590 回答