摘要:不然將根據屬性名稱進行排序。獲取包裝器獲取包裝器我們可以直接轉換模型對象為。所有與對象不能包含值。它們將作為類型進行序列化。我們定義了一個抽象類。使用會獲得最佳性能。許可證許可證庫使用許可證。
這是一個可以幫助你不需要.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
為自定義的IMessageFieldProvider
。
你需要為每個需要自定義消息字段的類型設置
IMessageFieldProvider
。
給屬性添加System.Runtime.Serialization.DataMemberAttribute
特性然后設置Order
屬性。
不然將根據屬性名稱進行排序。
?? 如果有任何一個屬性使用了
DataMemberAttribute
特性,將只會序列化擁有DataMemberAttribute
特性的屬性。
?? 如果全部沒有使用
DataMemberAttribute
特性,服務如果因為部署問題使用了不同版本的模型,反序列化時可能因為字段排序問題存在錯誤。
通過調用靜態方法MessageBuilder.SetTypeInitializer
來設置對象初始化委托。
我們可以直接轉換模型對象為Message<>
。
SimplyModel model;Message message = model;
然后這個message
可以直接被Protobuf序列化。
C#類型 | Protobuf類型 | 消息結構 |
---|---|---|
bool(?) | bool | Varint |
sbyte(?) | int32 | Varint |
byte(?) | int32 | Varint |
short(?) | int32 | Varint |
ushort(?) | int32 | Varint |
int(?) | int32 | Varint |
long(?) | int64 | Varint |
uint(?) | uint32 | Varint |
ulong(?) | uint64 | Varint |
float(?) | float | Varint |
double(?) | double | Varint |
string | string | Length-delimited |
byte[] | ByteString | Length-delimited |
Guid(?) | ByteString | Length-delimited |
DateTime(?) | google.protobuf.Timestamp | Length-delimited |
DateTimeOffset(?) | google.protobuf.Timestamp | Length-delimited |
TimeSpan(?) | google.protobuf.Duration | Length-delimited |
IMessage | Length-delimited | |
T[] | RepeatedField | Length-delimited |
ICollection | RepeatedField | Length-delimited |
Collection | RepeatedField | Length-delimited |
IList | RepeatedField | Length-delimited |
List | RepeatedField | Length-delimited |
IDictionary | MapField | Length-delimited |
Dictionary | MapField | Length-delimited |
Nullable<>
可空類型。Google.Protobuf.IMessage
的Protobuf對象作為屬性類型。RepeatedField
與MapField
對象不能包含null
值。byte
,sbyte
,short
和ushort
作為屬性類型。int
類型進行序列化。int
可能會丟失數據。首先,Protobuf通過Google.Protobuf.IMessage
與Google.Protobuf.IBufferMessage
接口進行序列化工作。
我們定義了一個抽象類Wodsoft.Protobuf.Message
。
然后定義抽象保護方法Read
,Write
,CalculateSize
。
顯式實現這些接口并調用這些方法。
然后定義泛型抽象類Wodsoft.Protobuf.Message
。
這里有一個屬性可以直接獲取到原始類型值。然后我們實現了一些隱式轉換操作。
public T Source { get; }
最后,為需要序列化的類型動態創建繼承了Message
的類。
通過Emit動態創建代碼實現Read
,Write
,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
摘要:通過類庫提供的和分別執行序列化和反序列化,而不用依賴任何生成的代碼。只針對平臺的話,不需要文件就可以應用序列化協議。前一篇文章我們看到使用Google.Protobuf有諸多不便(參考《如何在C#中使用Google.Protobuf工具》),這次我們來看看另一個工具的使用體驗。相關資料、鏈接:github項目:https://github.com/protobuf-net/protobuf-...
摘要:優點在谷歌內部長期使用產品成熟度高跨語言支持多種語言包括和編碼后的消息更小更加有利于存儲和傳輸編解碼的性能非常高支持不同協議版本的前向兼容支持定義可選和必選字段的入門是一個靈活高效結構化的數據序列化框架相比與等傳統的序列化工具它更小更快更簡 Google Protobuf 優點: 在谷歌內部長期使用, 產品成熟度高. 跨語言、支持多種語言, 包括 C++、Java 和 Python....
摘要:在爬蟲的編寫過程中使用最多的是,它表示查看請求和響應的數據內容。后續在打開剛才加載的軟件,例如本次案例打開的是皮皮蝦,開啟,成功捕獲到如下請求,這個地方就是最終的接口了。復制接口地址,在本地瀏覽器打開,得到皮皮蝦的視頻評論數據。 ...
摘要:采用微服務架構設計的原因很簡單解放生產力。運行時服務缺少標準,各類實現區別很大,調試困難程度不一,集成測試更是難上加難。小伙伴們更進一步的互相提供幫助集成測試及單元測試,極大的釋放了團隊生產力。 showImg(https://dn-coding-net-production-pp.qbox.me/e205ba4f-5db9-4719-bc00-cae9823c2d74.png); ...
摘要:公司使用來作為通訊格式,一個同事這樣的寫法文件格式使用的時候這時候拿到的是一個要是改成這樣這時候拿到的是一個為什么會出現這種情況呢讀了源碼才知道是這樣處理的這里發現只要才會進行包裝,要不調用的是那么是什么時候變成不為呢繼續看代碼發現只要是調 公司使用protobuf來作為通訊格式,一個同事這樣的寫法proto文件格式: message PlayerFightQueue { op...
閱讀 2132·2023-04-26 03:06
閱讀 3580·2023-04-26 01:51
閱讀 2085·2021-11-24 09:38
閱讀 2452·2021-11-17 17:00
閱讀 2323·2021-09-28 09:36
閱讀 940·2021-09-24 09:47
閱讀 2586·2019-08-30 15:54
閱讀 1554·2019-08-30 15:44