ProtoBuf入门
一、什么是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