是ggle发明的,语言中立的,平台独立的,可扩展的结构化数据的序列化机制,相比xml和json,更小,更快,更简单,由于是二进制格式,不是人类可读的。
protobuf支持向后兼容,二个月前定义的.proto,昨天又新添加了field,那二个月之前的程序读昨天定义的.proto文件序列化的数据没有问题,即,老程序会忽略新的field定义。
可以支持c++,c#,java, javascript等语言,使用时用户需要定义一个.proto文件,然后用protoc编译器自动生成各个语言下的类文件,这些类文件可以用来读取和解析序列化文件。
protobuf是各个平台之间通信的一个理想方式,想想下面场景:
在桌面程序中由c#序列化一个文件,在浏览器中由javacript来呈现。
序列化数据可以作为blob存放到mysql数据库中。
协议编译器安装(Protocol Compiler Installation):
可以git clone源代码,然后编译,如果嫌麻烦,直接下载预编译的二进制文件:
https://github.com/google/protobuf/releases
windows下包的名称是(2018年1月份)protoc-3.5.1-win32.zip
除了二进制的编译器文件,对每个具体的语言还需要安装运行时,c#的运行时用
NuGet安装:
Install-Package Google.Protobuf -Version 3.5.1
最新版本的协议定义语言是proto3,支持c#,javascript, golang,超级棒
定义好了.proto文件,下一步生成c#的类,用到协议编译器protoc:
protoc -I=$SRC-DIR --csharp_out=$DST_DIR $SRC_DIR/addressbook.proto
直接cmd浏览到工程源代码所在目录,注意不能用powershell,语法不一样
protoc -I=./ --csharp_out=./ ./addressbook.proto
如果.proto文件不是放在当前目录下,就要费一点劲了,需要加上--proto_path:
protoc -I=./ --csharp_out=./ --proto_path=../../../HDStatic/ strokes.proto
网上有人吐槽:
A:\proto_dir>protoc.exe --csharp_out="A:/Output directory/" --proto_path=./ CNTK.proto
才行
c#类就生成出来了。
因为repeated field的每个元素都需要重新对tag number进行编码,所有对于
repeated类型的field最好用1到15之间的tag数,这能优化性能。
生成js文件:
..\HDFront\node_modules\.bin\pbjs -t static-module -w commonjs -o myproto.js .\strokes.proto
..\HDFront\node_modules\.bin\pbts -o myproto.d.ts myproto.js