zoukankan      html  css  js  c++  java
  • protobuf

    1.protobuf实例-PHP版http://blog.hucde.com/2011/07/20/180

    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类库)以下是具体操作例子

    ?View Code PHP
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    < ?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 对比的性能测试。

  • 相关阅读:
    获取指定目录下的所有文件
    char码值对应列表大全
    烂记性不如好笔头㈠㈢㈥
    SQL Server中的Image数据类型的操作
    企业信息化与标准化的纠结(二)
    企业信息化的前世今生
    企业信息化与标准化的纠结(一)
    关于 EOM(Enterprise Operating Model)企业经营模型(1) 转自n216
    《优秀程序员应该具备哪些素质》(ZT)
    谈谈MIS建设与职能架构的问题
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/3499401.html
Copyright © 2011-2022 走看看