Python使用ProtoBuffer


Python使用ProtoBuffer

Protocol Buffers,是Google公司開發的一種數據描述語言,類似於XML能夠將結構化數據序列化,可用於數據存儲、通信協議等方面。
就可讀性而言感覺沒有JSON直接,不過由於使用二進制傳輸,效率得到大大提升,用在RPC比較合適

1. 安裝

在Ubuntu下非常方便

pip install protobuf    # 安裝protobuf庫
sudo apt-get install protobuf-compiler  # 安裝protobuf編譯器

2. 定義數據類型

syntax = "proto2";

package demo; // 申明包,防止命名沖突

// message類似於class,用於定義一個數據結構
// message之間可以相互嵌套
message Person{
    required string name = 1; // 1,2,3是字段的標識符
    required int32 id = 2;
    optional string email = 3;

    enum PhoneType {
        MOBILE = 1;
        HOME = 2;
        WORK = 3;
    }

    message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = HOME];
    }

    // 修飾符:required表示必須有,optional表示可選
    // repeated表示可有多個(包括0個)
    repeated PhoneNumber phones = 4;
}

message AdressBook {
    required Person people = 1;
}

3.編譯

# 通用格式
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto

# 這里,我們直接在當前目錄編譯
protoc --python_out=./ ./addressbook.proto

結果會在目標地址下生成addressbook_pb2.py

4. 文件寫入

# coding=utf-8
import addressbook_pb2

address_book = addressbook_pb2.AdressBook()

#### person1 ###
p1 = address_book.people.add()
p1.name = "Jack"
p1.id = 20
p1.email = "jack@qq.com"

phone_num1 = p1.phones.add()
phone_num1.number = "123"
phone_num1.type = 2  # 與默認類型不同

phone_num2 = p1.phones.add()
phone_num2.number = "456"
print(p1)

### person2 ###
p2 = address_book.people.add()
p2.name = "Chen"
p2.id = 21

# 遍歷,輸出repeated類型的成員
for phone in p1.phones:
    print(phone.type)

# 保存到二進制文件
f = open("address.pb", "wb")
f.write(address_book.SerializeToString()) # 調用串行化接口
f.close()

運行輸出

name: "Jack"
id: 20
email: "jack@qq.com"
phones {
  number: "123"
  type: HOME
}
phones {
  number: "456"
}

2
3

5. 文件讀取

# coding=utf-8
import addressbook_pb2

f = open("address.pb", "rb")
address_book = addressbook_pb2.AdressBook()
address_book.ParseFromString(f.read())
f.close()

for person in address_book.people:
    print(person.name)

運行輸出

Jack
Chen

6.小結

protobuffer用二進制來傳輸,性能應該會有提升.但是雙方都要保留一份編譯后的pb2文件,相當於協議,感覺稍重稍復雜


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM