protobuf
from:http://blog.163.com/typhoon_1986/blog/static/678877802011910102113393/
序列化王道之protobuf
开发某些分布式系统时,常用的功能之一就是要在进程之间交互数据,当然,你可以用管道,shared memory,嵌入式数据库, in memory db等。但使用这些方式传送数据通常会遇到 某种语言的数据结构或对象的传输。这种不能直接传输的数据往往需要通过
概述
开发某些分布式系统时,常用的功能之一就是要在进程之间交互数据,当然,你可以用管道,shared memory,嵌入式数据库, in memory db等。但使用这些方式传送数据通常会遇到 某种语言的数据结构或对象的传输。这种不能直接传输的数据往往需要通过一种“协议”进行编码解码,序列化就是一种方式。而序列化的方法很多,如python的pickle,json, kryo等。google的protobuf是我认为最好的一种序列化协议之一。
本人主要使用python和c/c++, 而protobuf对这两种语言都做了实现:
python官方入门教程(英文):
http://code.google.com/apis/protocolbuffers/docs/pythontutorial.html
python官方API文档
http://code.google.com/apis/protocolbuffers/docs/reference/python/index.html
python如何使用:
1. 定义数据的格式(schema),建立文件addressbook.proto:
package tutorial; 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; } message AddressBook { repeated Person person = 1; }
2. 编译.proto文件:
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto
3. 使用这种格式的数据
两个主要的函数分别是:
SerializeToString() 序列化数据对象
ParseFromString() 反序列化
编写如下的测试用的python代码:
import addressbook_pb2 person = addressbook_pb2.Person() person.id = 1234 person.name = "John Doe" person.email = "jdoe@example.com" phone = person.phone.add() phone.number = "555-4321" phone.type = addressbook_pb2.Person.HOME print person str = person.SerializeToString() print len(str) pread = addressbook_pb2.Person() pread.ParseFromString(str) print pread
#!/usr/bin/env python
import addressbook_pb2
person = addressbook_pb2.Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
phone = person.phone.add()
phone.number = "555-4321"
phone.type = addressbook_pb2.Person.HOME
print person
str = person.SerializeToString()
print len(str)
pread = addressbook_pb2.Person()
pread.ParseFromString(str)
print pread
hadoop大数据相关