PHP使用protobuf3序列化常见数据格式

一、php安装protobuf3

1.composer安装protobuf

composer require google/protobuf

2.下载protoc 编译器,用来将proto文件生成php文件

下载链接:https://github.com/protocolbuffers/protobuf/releases/download/v21.9/protoc-21.9-win64.zip
更多下载链接:https://github.com/protocolbuffers/protobuf/releases
下载解压后,把bin目录加入环境变量。
参考:
github:https://github.com/protocolbuffers/protobuf
官网参考文档:https://developers.google.com/protocol-buffers/docs/reference/php-generated?hl=zh-cn

二、简单使用

1.Messages
创建proto文件,person.proto文件

syntax = "proto3";
package test;
message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

执行protoc --php_out=. person.proto生成php类。类的使用:

<?php
require_once 'vendor/autoload.php';
require_once 'Test/Person.php';
require_once 'GPBMetadata/Person.php';

$data=[
    'name'=>'xdf',
    'id'=>1,
    'email'=>'dfjj@dfj.com',

];
$persion=new \Test\Person($data);
$res=$persion->serializeToString();
var_export($res);

$obj=new \Test\Person();
$obj->mergeFromString($res);
echo "\n";
var_export($obj->getName());

2 嵌套Messages
person.proto文件

syntax = "proto3";
package test;
message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
  info info_msg = 4;
  
  message info{
    string phone = 1;
    string address = 2;
    int32 age = 3;
  }
}

再执行protoc --php_out=. person.proto重新生成php类。类的使用:

<?php
require_once 'vendor/autoload.php';
require_once 'Test/Person.php';
require_once 'Test/Person/info.php';
require_once 'GPBMetadata/Person.php';
$info=[
    'phone'=>'123456',
    'address'=>'xxxxxxx',
    'age'=>25
];
$data=[
    'name'=>'xdf',
    'id'=>1,
    'email'=>'dfjj@dfj.com',
    'info_msg'=>new \Test\Person\info($info)
];
$persion=new \Test\Person($data);
$res=$persion->serializeToString();
var_export($res);

$obj=new \Test\Person();
$obj->mergeFromString($res);
echo "\n";
var_export($obj->getName());
echo "\n";
var_export($obj->getInfoMsg()->getPhone());

3.Repeated
序列化带未知长度列表的数据
person.proto文件

syntax = "proto3";
package test;
message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
  repeated info info_msg = 4;
  
  message info{
    string phone = 1;
    string address = 2;
    int32 age = 3;
  }
}

再执行protoc --php_out=. person.proto重新生成php类。类的使用:

<?php
require_once 'vendor/autoload.php';
require_once 'Test/Person.php';
require_once 'Test/Person/info.php';
require_once 'GPBMetadata/Person.php';
$info=[
    'phone'=>'123456',
    'address'=>'xxxxxxx',
    'age'=>25
];
$data=[
    'name'=>'xdf',
    'id'=>1,
    'email'=>'dfjj@dfj.com',
    'info_msg'=>[new \Test\Person\info($info),new \Test\Person\info($info)]
];
$persion=new \Test\Person($data);
$res=$persion->serializeToString();
var_export($res);

$obj=new \Test\Person();
$obj->mergeFromString($res);
echo "\n";
var_export($obj->getName());
echo "\n";
var_export($obj->getInfoMsg()->count());
var_export($obj->getInfoMsg()[0]->getAddress());

4.Maps
序列化带未知长度列表的数据
person.proto文件

syntax = "proto3";
package test;
message Person {
    string name = 1;
    int32 id = 2;
    string email = 3;
    map<string, string> more= 4;
}

再执行protoc --php_out=. person.proto重新生成php类。类的使用:

<?php
require_once 'vendor/autoload.php';
require_once 'Test/Person.php';
require_once 'GPBMetadata/Person.php';

$data=[
    'name'=>'xdf',
    'id'=>1,
    'email'=>'dfjj@dfj.com',
    'more'=>['qq'=>'123456','wx'=>'wx001','phone'=>'11111']
];
$person=new \Test\Person($data);
$res=$person->serializeToString();

echo $res;

$obj=new \Test\Person();
$obj->mergeFromString($res);
echo "\n";
$children=$obj->getMore();

三、在项目中使用protobuf3

首先按原api写好proto文件并生成php文件,然后在composer.json中引入文件所在目录并执行composer dumpautoload
例:

			//响应的数据
        $data=[
            'id'=>1,
            'name'=>'test',
            'email'=>'test@test.com',
            'info'=>[
                'phone'=>12345678987,
                'address'=>'xxxxxxx',
                'age'=>66,
            ]
        ];
			//当有message嵌套时,直接传入$data未能成功序列化,故只能先转json再转
        $json=json_encode($data,320);
        $obj=new Persion();
        $obj->mergeFromJsonString($json);
        return $obj->serializeToString();

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ProtoBuf是一种数据序列化和反序列化的技术,它的全称是Protocol Buffers。ProtoBuf可以将结构化数据转换为二进制格式,以便在不同的系统之间进行高效的数据交换。使用ProtoBuf进行序列化和反序列化有以下几个优势: 1. 空间效率:ProtoBuf使用紧凑的二进制编码格式,可以大大减少数据的存储空间。相比于传统的文本格式如XML和JSON,ProtoBuf的数据大小通常要小得多。 2. 时间效率:ProtoBuf的解析和生成代码都是使用高效的机器生成,因此在序列化和反序列化过程中可以获得更快的速度。特别是在处理大规模数据时,ProtoBuf的效率更加显著。 3. 可读性:虽然ProtoBuf的数据是以二进制形式存储的,但是它的定义文件是以文本形式进行编写的,具有良好的可读性和可维护性。开发人员可以通过阅读ProtoBuf定义文件了解数据结构的字段和类型。 在前后端交互中,ProtoBuf可以作为一种通用的数据交换格式。前端可以将数据序列化ProtoBuf格式,然后发送给后端进行处理。后端可以将接收到的ProtoBuf数据反序列化为对象,然后进行相应的业务逻辑处理。 下面是使用ProtoBuf进行序列化和反序列化的示例代码: ```java // 创建一个user对象 User user = User.builder().id("1").age(20).name("张三").desc("programmer").build(); // 创建一个Group对象,将user放入group中 Group group = Group.builder().id("1").name("分组1").user(user).build(); // 使用ProtostuffUtils序列化 byte[] data = ProtostuffUtils.serialize(group); System.out.println("序列化后:" + Arrays.toString(data)); // 使用ProtostuffUtils反序列化 Group result = ProtostuffUtils.deserialize(data, Group.class); System.out.println("反序列化后:" + result.toString()); ``` 在上述代码中,首先创建了一个User对象和一个Group对象,然后使用ProtostuffUtils对Group对象进行序列化,将其转换为字节数组。接着使用ProtostuffUtils对字节数组进行反序列化,将其转换为Group对象。最后输出反序列化后的Group对象。 引用:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值