Protocol Buffers(又名 protobuf)是谷歌的语言无关、平台无关、可扩展的结构化数据序列化机制。他是Google 的数据交换格式,可用于网络通讯和数据存储。
Protobuf通过定义数据的结构,然后使用protoc工具生成的源代码(包括C#、java、C++、Python等),方便实现在各种语言中数据流的读取。
官方提供了如何使用 protobuf 的开发人员的教程:
https://developers.google.com/protocol-buffers/docs/tutorials
示例:https://github.com/protocolbuffers/protobuf/blob/master/examples
Protocol Buffers 的完整文档可通过以下网址获得:
https://developers.google.com/protocol-buffers/
协议编译器是用 C++ 编写的,我们可以直接下载编译后的exe。
github上网址:https://github.com/protocolbuffers/protobuf
编译完成版本:https://github.com/protocolbuffers/protobuf/releases
protoc 64为下载地址:protoc-3.18.1-win64.zip
完整版下载地址:protobuf-all-3.18.1.zip
解压后bin目录下:protoc.exe可以根据定义的结构体,直接生成各语言的代码。
// 输出c#代码 protoc --csharp_out=./ telegram.proto // 输出java代码 protoc --java_out=./ telegram.proto三、.proto文件
protobuf 需要定义一个数据结构的描述文件,用来说明数据的内容。
如下,是官网的一个例子:
syntax = "proto3"; // proto3 必须加此注解 message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; enum Corpus { UNIVERSAL = 0; WEB = 1; IMAGES = 2; LOCAL = 3; NEWS = 4; PRODUCTS = 5; VIDEO = 6; } Corpus corpus = 4; }
上面是定义的一个message。包含:
String 类型的 query,编号是 1
int 类型的 page_number,编号是 2
枚举类型的 corpus
简单使用如下:
C#例子
// 定义对象,复制 Telegram data = new Telegram (); data.UserCode = 76157; data.Status = RunStaus.Loaded; // 计算大小 int size = data.CalculateSize(); Console.WriteLine(size); // 输出对象到文件 FileStream fso = new FileStream("test.data", FileMode.Create); data.WriteTo(fso ); fsfso Close(); // 读取文件生成对象 FileStream fsi = new FileStream("test.data", FileMode.Open); Telegram data2 = new Telegram (); data2.MergeFrom(fsi ); fsi .Close();
Java例子
Telegram data= Telegram.newBuilder().setUserCode(1).setStatus(RunStaus.Loaded); // 输出对象到为Byte数组 for(byte byte : data.toByteArray()){ System.out.println(byte); } // 转化Byte数组为对象 Telegram data2= null; try { data2= Telegram.parseFrom(data.toByteArray()); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } System.out.println(data2.toString());
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)