protobuf的简介
Protocol buffers是用于序列化结构化数据的灵活、高效、自动化的机制——比如XML,但是更小、更快、更简单。您只需定义一下希望如何对数据进行结构化,然后就可以使用特殊生成的源代码来轻松地编写和读取到各种数据流中的结构化数据,并使用各种语言。你甚至可以更新你的数据结构,而不必破坏那些被编译为“旧”格式的程序。
Google protobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。Google protobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。
Google 提供了多种语言的实现:Java、c#、c++、Go 和 Python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
1、.proto文件是protobuf一个重要的文件,它定义了需要序列化数据的结构。使用protobuf的3个步骤是:
第一步,在.proto文件中定义消息格式
第二步,用protobuf编译器编译.proto文件
第三步,用C++/Java等对应的protobuf API来写或者读消息
官方文档:https://developers.google.com/protocol-buffers/docs/overview
protobuf的安装,以protoc 3.5.1为例
protoc的源码和各个系统的预编译包:https://github.com/protocolbuffers/protobuf/releases
1、选择对应的安装文件下载,exe在bin里面, 比如 我的目录在 D:\do\protoc-3.5.1-win32\
2、添加到环境变量中。
我的电脑 右键-》属性 -》高级系统设置-》环境变量。
用户变量新建,Path . D:\do\protoc-3.5.1-win32\bin
系统变量增加一个 PROTOBUF_HOME D:\do\protoc-3.5.1-win32\bin
3.运行
打开 D:\do\protoc-3.5.1-win32\bin ,shift+右键,用命令行打开,输入
protoc.exe
protobuf的使用方法
1、基本用法
新建文件:hello.proto
syntax = 'proto3';
package lm;
message helloworld{
int32 id = 1 ;
string str = 2;
int32 opt = 3;
}
2. 运行,这个文件, 让其自动生成想要的文件
protoc hello.proto --php_out=./
解释: --php_out :编译输出成php文件
--python_out : 编译输出成python文件
这是会生成2个文件夹 GPBMetadata 和Lm,
此时查看lm文件夹下的helloword.php发现它 use了Google\Protobug下的类,这时一个php库,可以去下载
composer require google/protobuf
使用composer引入google/protobuf后,项目种会出现一个vendor目录。在自己的代码中include vendor下的autoload.php,以及刚才生成的helloword.php文件,就可以进行二进制的读写了。
测试二进制读写
写入二进制文件
include_once "vendor/autoload.php"; include_once "GPBMetadata/hello.php"; include_once "Lm/hellword.php"; $from = new \Lm\helloword(); $from->setId(1); $from->setOpt(29); $from->setStr("foo bar, this is a message"); $data = $from->serializeToString(); file_put_contents("data.ini",$data); 读取二进制文件
include_once "vendor/autoload.php"; include_once "GPBMetadata/hello.php"; include_once "Lm/helloword.php"; $data = file_get_contents("data.bin"); $to = new \Lm\helloword(); $to->mergeFromString($data); echo $to->getId().PHP_EOL; echo $to->getOpt().PHP_EOL; echo $to->getStr().PHP_EOL;