国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

.NET Protobuf包裝器庫

Carl / 2451人閱讀

摘要:不然將根據屬性名稱進行排序。獲取包裝器獲取包裝器我們可以直接轉換模型對象為。所有與對象不能包含值。它們將作為類型進行序列化。我們定義了一個抽象類。使用會獲得最佳性能。許可證許可證庫使用許可證。

Wodsoft Protobuf Wrapper

內容

關于

這是一個可以幫助你不需要.proto文件就能夠使用Protobuf序列化的一個庫。

通常.proto文件會創建繼承IMessage接口的模型,Protobuf使用這些模型來進行序列化。

有時候我們已經在自己的.NET項目里創建了一些模型,但我們需要使用Protobuf對這些模型進行序列化。
這時候這個庫就能幫助你使用Protobuf對已存在的模型進行序列化。

Github地址:Wodsoft.Protobuf.Wrapper

需求

Wodsoft.Protobuf.Wrapper需要NETStandard 2.0或以上。

這個庫需要工作在允許動態代碼編譯的平臺。所以IOS不支持。

安裝

在NuGet上獲取Wodsoft.Protobuf.Wrapper.

dotnet add package Wodsoft.Protobuf.Wrapper

用法

序列化

可以使用Wodsoft.Protobuf.Message類中的靜態方法Serialize
你需要一個System.IO.Stream來存儲序列化后的數據。

YourModel model = new ();MemoryStream stream = new MemoryStream();Message.Serialize(stream, model);

這里也有一個重載方法。
你可以傳遞一個Google.Protobuf.CodedInputStream來替代System.IO.Stream。

YourModel model = new ();CodedInputStream input = ...;Message.Serialize(input, model);

或者你想直接拿到序列化后的字節數組。

YourModel model = new ();var bytes = Message.SerializeToBytes(model);

反序列化

你可以使用Wodsoft.Protobuf.Message類中的靜態方法Deserialize
你需要傳遞包含需要反序列化數據的System.IO.Stream
它將返回你的泛型對象T。

Stream stream = ...;YourType model = Message.Deserialize(stream);

這里也有一個重載方法。
你可以傳遞一個Google.Protobuf.CodedOutputStream來替代System.IO.Stream

CodedOutputStream output = ...;YourType model = Message.Deserialize(output);

或者你想直接從字節數組進行反序列化。

YourType model = Message.DeserializeFromBytes(bytes);

字段定義

IMessageFieldProvider.GetFields(Type type)會返回從對象映射而來的消息字段。

默認實現是GeneralMessageFieldProvider.Intance類。
它只會映射可讀寫的屬性到消息字段。

你可以創建自己的IMessageFieldProvider去映射消息字段。
然后通過設置靜態屬性Message.FieldProvider為自定義的IMessageFieldProvider。

你需要為每個需要自定義消息字段的類型設置IMessageFieldProvider

字段排序

給屬性添加System.Runtime.Serialization.DataMemberAttribute特性然后設置Order屬性。
不然將根據屬性名稱進行排序。

?? 如果有任何一個屬性使用了DataMemberAttribute特性,將只會序列化擁有DataMemberAttribute特性的屬性。

?? 如果全部沒有使用DataMemberAttribute特性,服務如果因為部署問題使用了不同版本的模型,反序列化時可能因為字段排序問題存在錯誤。

非空構造函數

通過調用靜態方法MessageBuilder.SetTypeInitializer(Func initializer)來設置對象初始化委托。

獲取Protobuf包裝器

我們可以直接轉換模型對象為Message<>

SimplyModel model;Message message = model;

然后這個message可以直接被Protobuf序列化。

高級

支持的屬性類型與Protobuf類型的關系

C#類型Protobuf類型消息結構
bool(?)boolVarint
sbyte(?)int32Varint
byte(?)int32Varint
short(?)int32Varint
ushort(?)int32Varint
int(?)int32Varint
long(?)int64Varint
uint(?)uint32Varint
ulong(?)uint64Varint
float(?)floatVarint
double(?)doubleVarint
stringstringLength-delimited
byte[]ByteStringLength-delimited
Guid(?)ByteStringLength-delimited
DateTime(?)google.protobuf.TimestampLength-delimited
DateTimeOffset(?)google.protobuf.TimestampLength-delimited
TimeSpan(?)google.protobuf.DurationLength-delimited
IMessageLength-delimited
T[]RepeatedFieldLength-delimited
ICollectionRepeatedFieldLength-delimited
CollectionRepeatedFieldLength-delimited
IListRepeatedFieldLength-delimited
ListRepeatedFieldLength-delimited
IDictionaryMapFieldLength-delimited
DictionaryMapFieldLength-delimited
  • (?) 意思是可以為Nullable<>可空類型。
  • 可以直接使用繼承了Google.Protobuf.IMessage的Protobuf對象作為屬性類型。
  • 所有RepeatedFieldMapField對象不能包含null值。
  • 支持byte,sbyte,shortushort作為屬性類型。
    它們將作為int類型進行序列化。
    如果從其它第三方來源數據進行反序列化,int可能會丟失數據。

如何工作

首先,Protobuf通過Google.Protobuf.IMessageGoogle.Protobuf.IBufferMessage接口進行序列化工作。

我們定義了一個抽象類Wodsoft.Protobuf.Message。
然后定義抽象保護方法Read,Write,CalculateSize。
顯式實現這些接口并調用這些方法。

然后定義泛型抽象類Wodsoft.Protobuf.Message。
這里有一個屬性可以直接獲取到原始類型值。然后我們實現了一些隱式轉換操作。

public T Source { get; }

最后,為需要序列化的類型動態創建繼承了Message的類。
通過Emit動態創建代碼實現ReadWrite,CalculateSize方法。

性能

  • 建議使用 RepeatedField<>IList<>ICollection<>作為集合屬性的類型。
    使用RepeatedField<>會獲得最佳性能(因為不需要額外類型轉換)。
  • 使用IList<>ICollection<>在序列化時會轉換為RepeatedField<>。
  • 使用List<>Collection<>在序列化時會轉換為RepeatedField<>
    并且在反序列化時會轉換回List<>Collection<>(上一個會直接返回RepeatedField<>)。
  • 推薦使用 MapField<,>IDictionary<,>作為字典屬性的類型。
    使用MapField<,>會獲得最佳性能
  • 使用IDictionary<,>在序列化時會轉換為MapField<,>。
  • 使用Dictionary<,>在序列化時會轉換為MapField<,>
    并且在反序列化時會轉換回Dictionary<,>(上一個會直接返回MapField<,>)。

許可證

庫使用MIT許可證。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123653.html

相關文章

  • C#中使用protobuf-net進行序列化

    摘要:通過類庫提供的和分別執行序列化和反序列化,而不用依賴任何生成的代碼。只針對平臺的話,不需要文件就可以應用序列化協議。前一篇文章我們看到使用Google.Protobuf有諸多不便(參考《如何在C#中使用Google.Protobuf工具》),這次我們來看看另一個工具的使用體驗。相關資料、鏈接:github項目:https://github.com/protobuf-net/protobuf-...

    不知名網友 評論0 收藏0
  • Google Protobuf 編解碼

    摘要:優點在谷歌內部長期使用產品成熟度高跨語言支持多種語言包括和編碼后的消息更小更加有利于存儲和傳輸編解碼的性能非常高支持不同協議版本的前向兼容支持定義可選和必選字段的入門是一個靈活高效結構化的數據序列化框架相比與等傳統的序列化工具它更小更快更簡 Google Protobuf 優點: 在谷歌內部長期使用, 產品成熟度高. 跨語言、支持多種語言, 包括 C++、Java 和 Python....

    Eric 評論0 收藏0
  • Python爬蟲120例之案例58,手機APP爬蟲,“武器庫”的準備and皮皮蝦APP的測試

    摘要:在爬蟲的編寫過程中使用最多的是,它表示查看請求和響應的數據內容。后續在打開剛才加載的軟件,例如本次案例打開的是皮皮蝦,開啟,成功捕獲到如下請求,這個地方就是最終的接口了。復制接口地址,在本地瀏覽器打開,得到皮皮蝦的視頻評論數據。 ...

    roundstones 評論0 收藏0
  • Docker 技術與 Coding.net 技術架構的變遷

    摘要:采用微服務架構設計的原因很簡單解放生產力。運行時服務缺少標準,各類實現區別很大,調試困難程度不一,集成測試更是難上加難。小伙伴們更進一步的互相提供幫助集成測試及單元測試,極大的釋放了團隊生產力。 showImg(https://dn-coding-net-production-pp.qbox.me/e205ba4f-5db9-4719-bc00-cae9823c2d74.png); ...

    Sunxb 評論0 收藏0
  • 使用java google protobuf遇到一個的小坑

    摘要:公司使用來作為通訊格式,一個同事這樣的寫法文件格式使用的時候這時候拿到的是一個要是改成這樣這時候拿到的是一個為什么會出現這種情況呢讀了源碼才知道是這樣處理的這里發現只要才會進行包裝,要不調用的是那么是什么時候變成不為呢繼續看代碼發現只要是調 公司使用protobuf來作為通訊格式,一個同事這樣的寫法proto文件格式: message PlayerFightQueue { op...

    tinysun1234 評論0 收藏0

發表評論

0條評論

Carl

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<