protobuf实例-PHP版
protobuf实例-PHP版
mickelfeng 发表于5年前
protobuf实例-PHP版
  • 发表于 5年前
  • 阅读 522
  • 收藏 0
  • 点赞 0
  • 评论 2

protobuf实例-PHP版

protobuf简介
protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持php、java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。

更多信息可参考官方文档
http://code.google.com/p/protobuf/

http://code.google.com/p/pb4php/(这是PHP类库)以下是具体操作例子


<?php
require_once('parser/pb_parser.php'); $test = new PBParser(); $test->parse('./test.proto');
 
require_once('message/pb_message.php');
require_once('pb_proto_test.php');
$string = file_get_contents('./example/test.pb');
 
$book = new AddressBook();
$person = $book->add_person();
$person->set_name('Kordulla');
$person->set_surname('Nikolai');
 
$phone_number = $person->add_phone();
$phone_number->set_number('49');
$phone_number->set_type(Person_PhoneType::WORK);
 
$phone_number = $person->add_phone();
$phone_number->set_number('171');
$phone_number->set_type(Person_PhoneType::MOBILE);
 
// serialize
$string = $book->SerializeToString();
//echo $string;
// write it to disk
file_put_contents('adressbook.pb', $string);
$string = file_get_contents('./adressbook.pb');
// Just read it
$book = new AddressBook();
$book->parseFromString($string);
 
var_dump($book->person_size());
$person = $book->person(0);
var_dump($person->name());
var_dump($person->surname());
var_dump($person->phone(0)->number());
var_dump($person->phone(0)->type());
var_dump($person->phone(1)->number());
var_dump($person->phone(1)->type());

输出

int(1) string(8) "Kordulla" string(7) "Nikolai" string(2) "49" int(2) string(3) "171" int(0)
“adressbook.pb” 是生成的二进制文件 基本结构一个字节类型+ 字节长度
从以上操作和类库源代码来看打包速度可能慢很多。 空间节省倒是非常好。符合 protobuf 定义:效率、数据大小、易用性之间的平衡。

在网上也可以搜索到xml、json、protobuf 对比的性能测试。

http://blog.hucde.com/2011/07/20/180


共有 人打赏支持
mickelfeng
粉丝 213
博文 890
码字总数 503233
评论 (2)
eleven0220
为什么不放开????
不要点击我
我使用了它,但是有一个问题,它不支持三层嵌套的数据!!! 可实用性太差啦!!!
还有就是长期不更新!现在一个项目有4层的嵌套数据!!有什么好点的方法嘛???
×
mickelfeng
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: