Protobuf對比XML、Json等其他序列化的優勢
- protobuf 不管是處理時間上,還是空間占用上都優於現有的其他序列化方式。內存暫用是java 序列化的1/9,時間也是差了一個數量級,一次操作在1us左右。缺點:就是對象結構體有限制,只適合於內部系統使用。
- json格式在空間占用還是有一些優勢,是java序列化的1/2.6。序列化和反序列化處理時間上差不多,也就在5us。當然這次使用的jackson,如果使用普通的jsonlib可能沒有這樣好的性能,jsonlib估計跟java序列化差不多。
- xml相比於java序列化來說,空間占用上有點優勢,但不明顯。處理時間上比java序列化多了一個數量級,在100us左右。
- 以前一種的java序列化,表現得有些失望
- hessian測試有點意外,具體序列化數據上還步入json。性能上也不如jackjson,輸得比較徹底。
- hessian使用壓縮,雖然在字節上有20%以上的空間提升,但性能上差了4,5倍,典型的以時間換空間。總的來說還是google protobuf比較給力
protobuf | jackson | xstream | Serializable | hessian2 | hessian2壓縮 | hessian1 | |
序列化(單位ns) | 1154 | 5421 | 92406 | 10189 | 26794 | 100766 | 29027 |
反序列化(單位ns) | 1334 | 8743 | 117329 | 64027 | 37871 | 188432 | 37596 |
bytes | 97 | 311 | 664 | 824 | 374 | 283 | 495 |
准備環境:
1,Python版本3.5.4
2,Protobuf版本3.7.0
3,Protobuf安裝包:protoc-3.7.0-rc1-win64.zip
4,Win10 64位系統
步驟:
【下載protoc】
https://github.com/google/protobuf/releases
根據自己的平台下載對應的編譯器,我的是win10-64位,所以下載 protoc-3.7.0-rc1-win64.zip
設置環境變量:這一步使你在本地任何地方使用protoc這個指令
(右擊“此電腦”。。。)
測試protoc:
新打開一個命令行:輸入protoc --version,如果將輸出版本號,說明protoc安裝好了
【編寫.proto協議文件】
新建一個protobuf文件夾,手動創建test2.proto文件:
並在test2.proto中輸入:
syntax = "proto2";
message testinfo
{
required int32 devtype = 1;
required int32 devid = 2;
required int32 unitid = 3;
required int32 chlid = 4;
optional int32 testid = 5 [default = 0];
required bytes stepdata = 6;
}
【編譯】:
打開命令行,切換到protobuf文件夾下下面,執行protoc --python_out=./ test2.proto
然后會生成一個python文件
在目錄下新建文件 test.py,寫入代碼
import test2_pb2 testinfo = test2_pb2.testinfo() testinfo.devtype = 100 testinfo.devid = 2 testinfo.unitid = 3 testinfo.chlid = 4 testinfo.testid = 250 testinfo.stepdata = b'abd' print(testinfo, testinfo.devtype) # 打印 protobuf 結構的內容 out = testinfo.SerializeToString() print(out) # 打印 Protobuf 序列字符串 decode = test2_pb2.testinfo() decode.ParseFromString(out) print(decode) # 打印 解析Protobuf后的內容
運行python代碼,得到以下結果,證明實驗成功!