Google Protocol Buffer 详述

2019-11-14  本文已影响0人  洛丽塔的云裳

工作经常使用proto,但只是简单了解,没有深入学习,现梳理如下

1. protobuf 介绍

参见

  1. https://developers.google.com/protocol-buffers/
  2. https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,它是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。支持 c#, dart, Go, java,python语言.

2. protobuf 安装

当为Python使用时,需要执行一下操作

3. protobuf 简单使用

(1) 举例:info_person.proto
package Info;
message Person{
    required string name = 1;
    required int32 id = 2;
    optional string email = 3;
    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }
    message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = HOME];
    }
    repeated PhoneNumber phone = 4;
}

packageName_MessageName.proto

(2) 使用编译.proto文件,

使用protoc -I=./ --python_out=./ info_person.proto 进行编译。本例中生成info_person_pb2.py

说明
a. -I是原文件路径,
b. --python_out表示对应python库的生成路径,
c. info_person.proto 是指定编译的proto文件

(3) 如何使用pb2文件
#-*- coding: utf-8 -*-
import os
import info_person_pb2 # 导入生成的pb文件

if __name__ == '__main__':
    person = info_person_pb2.Person()
    person.name = 'xiaozhang'
    person.id = 1
    person.email = 'hello@xx.email.com'
    # 嵌套message
    phone_number = person.phone.add()
    phone_number.number = '1234567'
    phone_number.type = 0
    print "====序列化===="
    phone_serialize = phone_number.SerializeToString()
    person_serialize = person.SerializeToString()
    print type(person_serialize)
    print person_serialize # 二进制字符串,不可读
    print "====反序列化===="
    person2 = info_person_pb2.Person()
    person2.ParseFromString(person_serialize)
    print type(person2)
    print person2
    print "====获取required字段===="
    print person2.name
    print "====获取嵌套message信息===="
    for aphone in person2.phone:
        print aphone.number

测试结果:


上一篇下一篇

猜你喜欢

热点阅读