序列化/反序列化协议缓冲区

use*_*995 3 c# mapping serialization protocol-buffers

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

问题在于,byte []创建为ByteString类型,而List <T>创建为RepeatedField <T>。现在,我遇到的问题是我没有成功地100%成功地序列化或反序列化它们。

基本类型的工作原理很吸引人,但是协议缓冲区自己的类型可能是一个挑战。

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

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

我读过protobuf的较早版本,在那里(如果我没记错的话)有所谓的生成器,您可以访问每条消息的可变属性,这会使序列化/反序列化变得更加容易。还是有一种更明显的方式来访问数据并将其存储在我没有看到的数据库中?

我知道消息不可变的原因,但实际上没有将包含数据保存到数据库的简单方法吗?感觉像一个重要功能。

PS:我知道有一个protobuf-net解决方案可以处理序列化/反序列化,但仅支持protobuf v.2,而我在很大程度上依赖v.3功能(例如Any)

小智 6

我已经有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());
}
Run Code Online (Sandbox Code Playgroud)