摘要:不然將根據(jù)屬性名稱進(jìn)行排序。獲取包裝器獲取包裝器我們可以直接轉(zhuǎn)換模型對象為。所有與對象不能包含值。它們將作為類型進(jìn)行序列化。我們定義了一個抽象類。使用會獲得最佳性能。許可證許可證庫使用許可證。
這是一個可以幫助你不需要.proto文件就能夠使用Protobuf序列化的一個庫。
通常.proto文件會創(chuàng)建繼承IMessage接口的模型,Protobuf使用這些模型來進(jìn)行序列化。
有時候我們已經(jīng)在自己的.NET項(xiàng)目里創(chuàng)建了一些模型,但我們需要使用Protobuf對這些模型進(jìn)行序列化。
這時候這個庫就能幫助你使用Protobuf對已存在的模型進(jìn)行序列化。
Github地址:Wodsoft.Protobuf.Wrapper
Wodsoft.Protobuf.Wrapper需要NETStandard 2.0或以上。
這個庫需要工作在允許動態(tài)代碼編譯的平臺。所以IOS不支持。
在NuGet上獲取Wodsoft.Protobuf.Wrapper.
dotnet add package Wodsoft.Protobuf.Wrapper
可以使用Wodsoft.Protobuf.Message
類中的靜態(tài)方法Serialize
。
你需要一個System.IO.Stream
來存儲序列化后的數(shù)據(jù)。
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);
或者你想直接拿到序列化后的字節(jié)數(shù)組。
YourModel model = new ();var bytes = Message.SerializeToBytes(model);
你可以使用Wodsoft.Protobuf.Message
類中的靜態(tài)方法Deserialize
。
你需要傳遞包含需要反序列化數(shù)據(jù)的System.IO.Stream
。
它將返回你的泛型對象T
。
Stream stream = ...;YourType model = Message.Deserialize(stream);
這里也有一個重載方法。
你可以傳遞一個Google.Protobuf.CodedOutputStream
來替代System.IO.Stream
。
CodedOutputStream output = ...;YourType model = Message.Deserialize(output);
或者你想直接從字節(jié)數(shù)組進(jìn)行反序列化。
YourType model = Message.DeserializeFromBytes(bytes);
IMessageFieldProvider.GetFields(Type type)
會返回從對象映射而來的消息字段。
默認(rèn)實(shí)現(xiàn)是GeneralMessageFieldProvider.Intance
類。
它只會映射可讀寫的屬性到消息字段。
你可以創(chuàng)建自己的IMessageFieldProvider
去映射消息字段。
然后通過設(shè)置靜態(tài)屬性Message
為自定義的IMessageFieldProvider
。
你需要為每個需要自定義消息字段的類型設(shè)置
IMessageFieldProvider
。
給屬性添加System.Runtime.Serialization.DataMemberAttribute
特性然后設(shè)置Order
屬性。
不然將根據(jù)屬性名稱進(jìn)行排序。
?? 如果有任何一個屬性使用了
DataMemberAttribute
特性,將只會序列化擁有DataMemberAttribute
特性的屬性。
?? 如果全部沒有使用
DataMemberAttribute
特性,服務(wù)如果因?yàn)椴渴饐栴}使用了不同版本的模型,反序列化時可能因?yàn)?strong>字段排序問題存在錯誤。
通過調(diào)用靜態(tài)方法MessageBuilder.SetTypeInitializer
來設(shè)置對象初始化委托。
我們可以直接轉(zhuǎn)換模型對象為Message<>
。
SimplyModel model;Message message = model;
然后這個message
可以直接被Protobuf序列化。
C#類型 | Protobuf類型 | 消息結(jié)構(gòu) |
---|---|---|
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
類型進(jìn)行序列化。int
可能會丟失數(shù)據(jù)。首先,Protobuf通過Google.Protobuf.IMessage
與Google.Protobuf.IBufferMessage
接口進(jìn)行序列化工作。
我們定義了一個抽象類Wodsoft.Protobuf.Message
。
然后定義抽象保護(hù)方法Read
,Write
,CalculateSize
。
顯式實(shí)現(xiàn)這些接口并調(diào)用這些方法。
然后定義泛型抽象類Wodsoft.Protobuf.Message
。
這里有一個屬性可以直接獲取到原始類型值。然后我們實(shí)現(xiàn)了一些隱式轉(zhuǎn)換操作。
public T Source { get; }
最后,為需要序列化的類型動態(tài)創(chuàng)建繼承了Message
的類。
通過Emit動態(tài)創(chuàng)建代碼實(shí)現(xiàn)Read
,Write
,CalculateSize
方法。
RepeatedField<>
,IList<>
或ICollection<>
作為集合屬性的類型。RepeatedField<>
會獲得最佳性能(因?yàn)椴恍枰~外類型轉(zhuǎn)換)。IList<>
或ICollection<>
在序列化時會轉(zhuǎn)換為RepeatedField<>
。List<>
或Collection<>
在序列化時會轉(zhuǎn)換為RepeatedField<>
。List<>
或Collection<>
(上一個會直接返回RepeatedField<>
)。MapField<,>
或IDictionary<,>
作為字典屬性的類型。MapField<,>
會獲得最佳性能。IDictionary<,>
在序列化時會轉(zhuǎn)換為MapField<,>
。Dictionary<,>
在序列化時會轉(zhuǎn)換為MapField<,>
。Dictionary<,>
(上一個會直接返回MapField<,>
)。庫使用MIT許可證。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123653.html
摘要:通過類庫提供的和分別執(zhí)行序列化和反序列化,而不用依賴任何生成的代碼。只針對平臺的話,不需要文件就可以應(yīng)用序列化協(xié)議。前一篇文章我們看到使用Google.Protobuf有諸多不便(參考《如何在C#中使用Google.Protobuf工具》),這次我們來看看另一個工具的使用體驗(yàn)。相關(guān)資料、鏈接:github項(xiàng)目:https://github.com/protobuf-net/protobuf-...
摘要:優(yōu)點(diǎn)在谷歌內(nèi)部長期使用產(chǎn)品成熟度高跨語言支持多種語言包括和編碼后的消息更小更加有利于存儲和傳輸編解碼的性能非常高支持不同協(xié)議版本的前向兼容支持定義可選和必選字段的入門是一個靈活高效結(jié)構(gòu)化的數(shù)據(jù)序列化框架相比與等傳統(tǒng)的序列化工具它更小更快更簡 Google Protobuf 優(yōu)點(diǎn): 在谷歌內(nèi)部長期使用, 產(chǎn)品成熟度高. 跨語言、支持多種語言, 包括 C++、Java 和 Python....
摘要:在爬蟲的編寫過程中使用最多的是,它表示查看請求和響應(yīng)的數(shù)據(jù)內(nèi)容。后續(xù)在打開剛才加載的軟件,例如本次案例打開的是皮皮蝦,開啟,成功捕獲到如下請求,這個地方就是最終的接口了。復(fù)制接口地址,在本地瀏覽器打開,得到皮皮蝦的視頻評論數(shù)據(jù)。 ...
摘要:采用微服務(wù)架構(gòu)設(shè)計(jì)的原因很簡單解放生產(chǎn)力。運(yùn)行時服務(wù)缺少標(biāo)準(zhǔn),各類實(shí)現(xiàn)區(qū)別很大,調(diào)試?yán)щy程度不一,集成測試更是難上加難。小伙伴們更進(jìn)一步的互相提供幫助集成測試及單元測試,極大的釋放了團(tuán)隊(duì)生產(chǎn)力。 showImg(https://dn-coding-net-production-pp.qbox.me/e205ba4f-5db9-4719-bc00-cae9823c2d74.png); ...
摘要:公司使用來作為通訊格式,一個同事這樣的寫法文件格式使用的時候這時候拿到的是一個要是改成這樣這時候拿到的是一個為什么會出現(xiàn)這種情況呢讀了源碼才知道是這樣處理的這里發(fā)現(xiàn)只要才會進(jìn)行包裝,要不調(diào)用的是那么是什么時候變成不為呢繼續(xù)看代碼發(fā)現(xiàn)只要是調(diào) 公司使用protobuf來作為通訊格式,一個同事這樣的寫法proto文件格式: message PlayerFightQueue { op...
閱讀 2144·2023-04-26 03:06
閱讀 3592·2023-04-26 01:51
閱讀 2092·2021-11-24 09:38
閱讀 2466·2021-11-17 17:00
閱讀 2337·2021-09-28 09:36
閱讀 948·2021-09-24 09:47
閱讀 2591·2019-08-30 15:54
閱讀 1560·2019-08-30 15:44