簡體   English   中英

序列化/反序列化協議緩沖區

[英]Serializing/Deserializing Protocol Buffers

我目前正在使用Protocol Buffers(版本3 C#)。 我正在向不同的服務發送消息。 並且目前正試圖將存儲在某些消息中的一些數據保存到數據庫中(實際上可以是任何類型)。

問題是byte []創建為ByteString類型, List <T>創建為RepeatedField <T> 現在我遇到的問題是我沒有成功地將它們100%序列化或反序列化。

基本類型就像魅力一樣,但協議緩沖區自己的類型可能是一個挑戰。

我嘗試了AutoMapper並創建了使ByteString可以序列化/反序列化的映射但是RepeatedField很難,因為它只是readonly並且有一個私有的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());
}

如果您知道模型中的哪個成員是protobuf重復字段,則可以指定映射目標值,而不是重復字段本身。 這避免了protobuf重復字段的頭痛,沒有為它定義公共'set'。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM