gpt4 book ai didi

c# - 序列化/反序列化 Protocol Buffer

转载 作者:行者123 更新时间:2023-11-30 14:24:21 25 4
gpt4 key购买 nike

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

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

基本类型就像一个魅力,但 Protocol Buffers 自己的类型可能是一个挑战。

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

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

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

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

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

最佳答案

我有 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());
}

关于c# - 序列化/反序列化 Protocol Buffer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41400459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com