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 = "[email protected]" 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 = "[email protected]" 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

你可能感兴趣的:(protobuf)