php protobuf 二进制,PHP环境中使用ProtoBuf数据格式
1、syntax="proto3":表明使用的是proto3格式,如果不指定则为proto2
2、package test:定义包名为test,生成类时,会产生一个目录为test
3、message Person:消息主体内容,里面为各个字段的定义
二、生成对应的PHP类
定义好Person的格式后,该格式如果不生成我们所需要的类库,其实是无任何意义的,还google提供一个工具protoc生成我们要的类库。
1、安装protoc
安装地址:protobuf-php-3.5.1.tar.gz,目前最新为3.5.1
官方发布地址:https://github.com/google/protobuf/releases/tag/v3.5.1
解压并安装:
tar -zxvf protobuf-php-3.5.1.tar.gz
cd protobuf-3.5.1
./configure --prefix=/opt/soft/protobuf
make
make install
2、生成类库
/opt/soft/protobuf/bin/protoc --php_out=./ person.proto
生成后将在当前目录产生如下文件:
GPBMetadata/Person.php
Test/Person.php
三、在PHP中使用ProtoBuf
在PHP中使用ProtoBuf依赖一个protobuf的扩展,目前提供两种方式进行使用,1:php的c扩展,2:php的lib扩展包,这两者均可在刚才下载包里可以找到。
另外,也可以使用composer进行安装该依赖扩展:composer require google/protobuf
这里我主要是使用composer安装,应该它可以帮我产生autoload
安装好依赖后,我们就可以开始在php环境下使用protobuf了
1、序列化
include 'vendor/autoload.php';
include 'GPBMetadata/Person.php';
include 'Test/Person.php';
$person = new TestPerson();
$person->setName("lailaiji");
$person->setAge("28");
$person->setSex(true);
$data = $person->serializeToString();
file_put_contents('data.bin',$data);
2、反序列化
include 'vendor/autoload.php';
include 'GPBMetadata/Person.php';
include 'Test/Person.php';
$bindata = file_get_contents('./data.bin');
$person = new TestPerson();
$person->mergeFromString($bindata);
echo $person->getName();
可以正常地输出lailaiji
PHP常用的使用方法:
序列化:
1、serializeToString:序列化成二进制字符串
2、serializeToJsonString:序列化成JSON字符串
反序列化:
1、mergeFromString:二进制字符串反序列化
2、mergeFromJsonString:Json字符串反序列化
.proto的message解析
1、定义:
类型 变量名=位置;
如:int32 age=1;
这里需要区分,变量名后面的数字意义为该变量内容在二进制序列中的位置而不是变量的值,该数字必须是唯一不可重复使用。
2、目前支持的类型:
double,float,int32,int64,uint32 ,uint64,sint32,sint64
fixed32,fixed64,sfixed32,sfixed64,bool,bytes
推荐教程:《PHP》
PHP环境中使用ProtoBuf数据格式相关教程
php protobuf 二进制,PHP环境中使用ProtoBuf数据格式相关推荐
- 在Go中使用Protobuf
本教程使用proto3版本的protocol buffer语言,提供了一个基本的在Go程序中使用protocol buffer的介绍.通过创建一个简单的示例应用程序,向你展示如何 在 .proto文件 ...
- 在Golang中使用Protobuf
本教程使用proto3版本的protocol buffer语言,提供了一个基本的在Go程序中使用protocol buffer的介绍.通过创建一个简单的示例应用程序,向你展示如何 在.proto文件中 ...
- 【Android Protobuf 序列化】Protobuf 服务器与客户端通信 ( TCP 通信中使用 Protobuf )
文章目录 一.TCP 粘包和分包 二.TCP 粘包和分包解决方案 三.客户端 Android 应用使用 Protobuf 四.服务器端 Java 服务器使用 Protobuf 五.参考资料 一.TCP ...
- ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化
场景 ProtoBuf简介 protocol buffers 是一种语言无关.平台无关.可扩展的序列化结构数据的方法,它可用于(数据)通信协议.数据存储等. Protocol Buffers 是一种灵 ...
- C#中使用ProtoBuf将list进行序列化并保存到文件
场景 C#中使用ProtoBuf提高序列化速度对比二进制序列化: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99850052 ...
- 在网络通讯中应用Protobuf
Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强:还有一个比较大的优点就是有着很多的语言平台支持.下面讲解一下如何 ...
- Intellij IDEA中使用Protobuf的正确姿势
一..proto文件语法高亮显示 需要安装Protobuf Support插件 依次点击Intellij中的"File"-->"Settings"--&g ...
- 怎样在Spark、Flink应用中使用Protobuf 3的包
如果在在Spark.Flink应用中使用Protobuf 3的包,因为Spark默认使用的是2.5版本的包,提交任务时,可能会报如下异常: com.google.protobuf.CodedInput ...
- unity项目源码_在Unity中使用protobuf
Protocol Buffers (通常简称为protobuf) 是Google开发的一种格式,这种格式与开发语言无关.与运行平台无关,用于序列化结构数据,并且很容易扩展.这种格式可以用于通信协议.数 ...
最新文章
- PHP 安全email
- 自定义eachFile遍历文件夹文件
- 「GIT SourceTree冲突」解决方案
- go interface 的坑
- 11.14/11.15 Apache和PHP结合 11.16/11.17 Apache默认虚拟主机
- c语言cin改scanf,我的代码用scanf输入wa了,改成cin就ac了 ?
- c++ 三维数组 初始化_013 JAVA 多维数组及数组的拷贝、冒泡排序、二分法查找...
- 【zipkin】链路追踪
- 软件工程导论 00章数据流图与数据字典
- a4纸和ipad对比_我告诉你10.2寸ipad和9.7寸对比
- 26丨 搜索引擎架构:如何瞬间完成海量数据检索?
- 广西南宁机器人比赛_缤纷校园|2018年广西中小学电脑机器人竞赛开赛 南宁学子大显身手...
- ROS2 中的 launch 文件入门的 6 个疑问
- ISSN码和ISBN码的区别
- 软件测试思想者(Software Testing - Thinker) - Logo一览
- Bazinga HDU - 5510
- RabbitMQ的Routing 路由模式(Direct)
- php 返回英文乱码,使用php 5时MySQL返回乱码的解决办法_php
- IOS navigationController详解
- Linux系统管理-audit文件太多导致du -sh命令卡死
热门文章
- ajax 高并发请求,理解node.js处理高并发请求原理
- spring mvc框架请求注解解析,内部资源视图解析器
- html下拉列表初始值不显示,javascript – 使用innerhtml显示下拉列表文本而不是值...
- android多个闹钟实现,Android编程实现PendingIntent控制多个闹钟的方法
- 分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view
- Des与3Des加密解密
- Leetcode143. Reorder List重排链表
- 关于客户端无法获得服务器端GP服务(Geoprocessing Service)结果的解决办法
- BulkLoader类使用
- 避免Eclipse经常出现Out Of Memory