怎樣給網(wǎng)站或者商品做推廣抖音seo軟件工具
目錄
基本介紹
原理
同類(lèi)對(duì)比
為什么要使用protobuf?
基本介紹
protobuf的全稱(chēng)是Protocol Buffer,是Google提供的一種數(shù)據(jù)序列化協(xié)議。Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)序列化,很適合做數(shù)據(jù)存儲(chǔ)或 RPC 數(shù)據(jù)交換格式。它可用于通訊協(xié)議、數(shù)據(jù)存儲(chǔ)等領(lǐng)域的語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式。 ?
結(jié)構(gòu)化數(shù)據(jù)是最為常見(jiàn)和熟悉的數(shù)據(jù)形態(tài),它由明確定義的信息組成,并以高度組織化的表格或數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)和管理。正如字面上表達(dá)的,就是帶有一定結(jié)構(gòu)的數(shù)據(jù)。比如電話簿上有很多記錄數(shù)據(jù),每條記錄包含姓名、ID、郵件、電話等,這種結(jié)構(gòu)重復(fù)出現(xiàn)。
目前Protobuf官方工程主頁(yè)上顯示的已支持的開(kāi)發(fā)語(yǔ)言多達(dá)10種,分別有:C++、Java、Python、Objective-C、C#、JavaNano、JavaScript、Ruby、Go、PHP,基本上主流的語(yǔ)言都已支持?
?
- 2001年初,Protobuf首先在Google內(nèi)部創(chuàng)建, 我們把它稱(chēng)之為?
proto1
,一直以來(lái)在Google的內(nèi)部使用,其中也不斷的演化,根據(jù)使用者的需求也添加很多新的功能,一些內(nèi)部庫(kù)依賴(lài)它。幾乎每個(gè)Google的開(kāi)發(fā)者都會(huì)使用到它。 - Google開(kāi)始開(kāi)源它的內(nèi)部項(xiàng)目時(shí),因?yàn)橐蕾?lài)的關(guān)系,所以他們決定首先把Protobuf開(kāi)源出去。 proto1在演化的過(guò)程中有些混亂,所以Protobuf的開(kāi)發(fā)者重寫(xiě)了Protobuf的實(shí)現(xiàn),保留了proto1的大部分設(shè)計(jì),以及proto1的很多的想法。但是開(kāi)源的proto2不依賴(lài)任何的Google的庫(kù),代碼也相當(dāng)?shù)那逦?008年7月7日,Protobuf開(kāi)始公布出來(lái)。
- Protobuf公布出來(lái)也得到了大家的廣泛的關(guān)注, 逐步地也得到了大家的認(rèn)可,很多項(xiàng)目也采用Protobuf進(jìn)行消息的通訊,還有基于Protobuf的微服務(wù)框架GRPC。在使用的過(guò)程中,大家也提出了很多的意見(jiàn)和建議,Protobuf也在演化,于2016年推出了Proto3。 Proto3簡(jiǎn)化了proto2的開(kāi)發(fā),提高了開(kāi)發(fā)的效能,但是也帶來(lái)了版本不兼容的問(wèn)題。
原理
ProtoBuf 是通過(guò)ProtoBuf編譯器將與編程語(yǔ)言無(wú)關(guān)的特有的 .proto 后綴的數(shù)據(jù)結(jié)構(gòu)文件編譯成各個(gè)編程語(yǔ)言(Java,C/C++,Python)專(zhuān)用的類(lèi)文件,然后通過(guò)Google提供的各個(gè)編程語(yǔ)言的支持庫(kù)lib即可調(diào)用API。
同類(lèi)對(duì)比
XML、JSON 也可以用來(lái)存儲(chǔ)此類(lèi)結(jié)構(gòu)化數(shù)據(jù),但是使用ProtoBuf表示的數(shù)據(jù)能更加高效,并且將數(shù)據(jù)壓縮得更小。
協(xié)議 | 場(chǎng)景 | 舉例 |
---|---|---|
xml | 主要在本地使用 | UI,游戲信息 |
json | http api | HTTP網(wǎng)頁(yè)注冊(cè)賬戶(hù) |
protobuf | 服務(wù)與服務(wù)的遠(yuǎn)程調(diào)用 | rpc,游戲,即時(shí)通訊,tars brpc |
用
protobuf
序列化后的大小是json
的10分之一,是xml
格式的20分之一,但是性能卻是它們的5~100倍,我覺(jué)得用戶(hù)一定會(huì)尖叫的:oh my god!
。?
如果有我們有一個(gè) person 對(duì)象,用 JSON、XML 和 protobuf 表示下它們各是什么樣。
用 XML 格式表示如下
<person><name>ivy</name><age>24</age>
</person>
用 JSON 格式表示如下
{"name":"ivy","age":24
}
用 protobuf 表示如下, 它直接用二進(jìn)制來(lái)表示數(shù)據(jù),不像上面 XML 和 JSON 格式那么直觀
[10 6 69 108 108 105 111 116 16 24]
三種格式優(yōu)點(diǎn):
- json優(yōu)點(diǎn)就是較XML格式更加小巧,傳輸效率較xml提高了很多,可讀性還不錯(cuò)。
- xml優(yōu)點(diǎn)就是可讀性強(qiáng),解析方便。
- ?protobuf優(yōu)點(diǎn)就是傳輸效率快,序列化后體積相比Json和XML很小,支持跨平臺(tái)多語(yǔ)言,消息格式升級(jí)和兼容性還不錯(cuò),序列化反序列化速度很快。
三種格式缺點(diǎn):
- json缺點(diǎn)就是傳輸效率也不是特別高(比xml快,但比protobuf要慢很多)。
- xml缺點(diǎn)就是效率不高,資源消耗過(guò)大。
- protobuf缺點(diǎn)就是使用不太方便。?
為什么要使用protobuf?
使用protobuf的原因肯定是為了解決開(kāi)發(fā)中的一些問(wèn)題,那使用其他的序列化機(jī)制會(huì)出現(xiàn)什么問(wèn)題呢?
- (1)java默認(rèn)序列化機(jī)制:效率極低,而且還能不能跨語(yǔ)言之間共享數(shù)據(jù)。
- (2)XML常用于與其他項(xiàng)目之間數(shù)據(jù)傳輸或者是共享數(shù)據(jù),但是編碼和解碼會(huì)造成很大的性能損失。
- (3)json格式也是常見(jiàn)的一種,但是在json在解析的時(shí)候非常耗時(shí),而且json結(jié)構(gòu)非常占內(nèi)存。
但是我們protobuf是一種靈活的、高效的、自動(dòng)化的序列化機(jī)制,可以有效的解決上面的問(wèn)題。