一、什么是ProtoBuf
Protobuf是一種與平台無關,語言無關、可擴展且輕便高效序列化數據結構的協議,可用於網絡通訊和數據存儲。Protocol Buffers 是一種靈活,高效,自動化機制的結構數據序列化方法-可類比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更為簡單。
Protobuf通過定義數據的結構,然后使用特殊生成的源代碼輕松的在各種數據流中使用各種語言進行編寫和讀取結構數據。你甚至可以更新數據結構,而不破壞由舊數據結構編譯的已部署程序。
二、如何安裝ProtoBuf
兩種方式:
(1)Nuget安裝搜索:Google.Protobuf
請參考:https://blog.csdn.net/q__y__L/article/details/86740156?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
(2)編譯安裝源代碼: https://github.com/protocolbuffers/protobuf
選擇protobuf-csharp-<版本號>.zip
下載后目錄如下:
三、安裝.protoc編譯器
https://github.com/protocolbuffers/protobuf
選擇protoc-<版本號>-rc-2-win32.zip
下載后目錄如下:
四、運行官方教程”AddressBook”項目
使用的編譯器為VS2019。
”AddressBook”項目實現了地址簿添加聯系人,顯示所有聯系人列表的功能。展示了如何AddressBook實例化、初始化、添加聯系人、導出聯系人。其中AddressBook.cs是通過.protoc編譯器生成C#腳本,不要試圖編輯。
運行”AddressBook”項目,當試圖添加聯系人時出現了些小問題。
提示addressbook.data文件不存在,在輸出目錄創建一個。
此時打開addressbook.data文件並沒有任何數據。
再次運行,這次發現並沒有提示addressbook.data文件不存在的信息。
退出程序后打開addressbook.data文件,發現我們的輸入數據存入進來。
五、關於.protoc編譯器
此編譯器是給非C++語言用Google.Protobuf人使用。
打開cmd,將之前下載好的.protoc編譯器直接拖到CMD用很多幫助操作說明,其中包含生成C#源代碼的命令行:
1、 配置環境變量
通過配置環境變量,在任何地方都可以運行.exe文件。配置方法:此電腦-屬性-高級系統設置-高級-環境變量-編輯Path變量-添加protoc.exe的所在目錄,然后就可以在cmd中輸入protoc運行protoc.exe了.
2、 遷移include文件夾下的文件
如果沒有include文件夾下的文件,在使用protoc.exe時會提示缺少google\protobuf\timestamp.proto。解決辦法是將include/google文件夾移動到指定了環境變量的文件夾。
3、 找到目錄:addressbook.data
所以命令行輸入如下(注意,第三句的/與a之間有空格,不然會出錯)
e: cd E:\WorkSpace\VS\protobuf-csharp-3.12.0\protobuf-3.12.0\examples protoc --csharp_out=./ addressbook.proto
然后我們在目錄中發現生成了AddressBook.cs文件。
六、關於.proto編寫請參考
https://blog.csdn.net/u011518120/article/details/54604615
七、如何使用批處理命令使用protoc.exe生成C#代碼
打開proto文件所在文件夾(如果有特殊需求,則需要執行cd命令來打開對應的文件),在其中創建.bat文件。
@echo off for %%i in (*.proto) do ( protoc --csharp_out=./ %%i rem 從這里往下都是注釋,可忽略 echo From %%i To %%~ni.cs Successfully! ) Pause
請參考:https://blog.csdn.net/qq_15020543/article/details/87877353
八、.protoc應用
通過Protobuf可以便捷的處理IMessage對象的解析/序列化. 如果我們直接將一個IMessage對象寫入字節流NETStream.write(byte[]),發送到其他機器,其他機器則可以根據反解析獲得這個IMessage,實現了通信.
IMessage→byte[]→socket→byte[]→IMessage。
九、Json 還是 Protobuf
請參考https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/81102369
本文參考:https://blog.csdn.net/qq_15020543/article/details/86776391
https://acgmart.com/server/unity8/
https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/81102369
https://blog.csdn.net/u011518120/article/details/54604615