【问题标题】:Serializing/Deserializing Protocol Buffers序列化/反序列化协议缓冲区
【发布时间】:2017-05-15 00:05:49
【问题描述】:

我目前正在使用协议缓冲区(版本 3 C#)。 我正在向不同的服务来回发送消息。 并且目前正在尝试将存储在某些消息中的一些数据保存到数据库中(实际上可以是任何类型的)。​​

问题在于 byte[] 被创建为类型 ByteStringList 被创建为 RepeatedField。 现在我遇到的问题是我没有设法 100% 成功地序列化或反序列化它们。

Basic types 的作用就像一个魅力,但 Protocol Buffers 自己的类型可能是一个挑战。

我尝试了 AutoMapper 并创建了使 ByteString 可以序列化/反序列化的映射,但 RepeatedField 很难,因为它是只读的并且有一个私有设置器并且不能在构造函数中设置。

我无法让 AutoMapper 正确映射到它,如果在此过程中遇到更多麻烦并想知道是否有更简单的方法将消息保存在数据库中,我不会感到惊讶?

我已经阅读了旧版本的 protobuf,其中(如果我没记错的话)有所谓的构建器,您可以访问每个消息的属性,这些属性是可变的,并且会使序列化/反序列化变得更加容易。或者是否有更明显的方式来访问数据并将其存储在我只是没有看到的数据库中?

我了解消息不可变的原因,但真的没有直接的方法可以将包含的数据保存到数据库吗? 感觉是一个重要的功能。

PS:我知道有一个 protobuf-net 解决方案可以处理序列化/反序列化,但它只支持 protobuf v.2,而且我非常依赖 v.3 功能,例如 Any

【问题讨论】:

    标签: c# serialization mapping protocol-buffers


    【解决方案1】:

    我已将 AutoMapper 6.1.1 映射到 protobufs 3 RepeatedField。我确信反射可以​​改进,但 AutoMapper 配置是:

    void Configure(IMapperConfigurationExpression cfg)
    {
        cfg.CreateMap<ProtoThings, HasListOfThings>().ReverseMap();
    
        bool IsToRepeatedField(PropertyMap pm)
        {
            if (pm.DestinationPropertyType.IsConstructedGenericType)
            {
                var destGenericBase = pm.DestinationPropertyType.GetGenericTypeDefinition();
                return destGenericBase == typeof(RepeatedField<>);
            }
            return false;
        }
        cfg.ForAllPropertyMaps(IsToRepeatedField, (propertyMap, opts) => opts.UseDestinationValue());
    }
    

    【讨论】:

    • 太棒了!自从我涉足那个项目以来已经有很长时间了,但出于好奇,我一定会检查一下。我的解决方案是下载 protoc 客户端的源代码并更改代码生成器,如果我没记错的话,所有重复的字段都有公共设置器。如果可行,则更喜欢您的解决方案。我会告诉你的,谢谢。
    • 这个解决方案适用于我的 proto3 和 AutoMapper 6.2.2
    【解决方案2】:

    如果您知道模型中的哪个成员是 protobuf 重复字段,则可以指定映射目标值,而不是重复字段本身。这避免了 protobuf 重复字段没有为它定义公共“集”的麻烦。

    CreateMap<Model, ProtoModel>().ForMember(dest => dest.MyRepeatedCollection, opt => opt.UseDestinationValue());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多