分类 - protoBuf

2017-09-13 21:30:20    46    0    0

1、在.proto文件中定义消息格式

2、使用protobuf编译器
3、使用c++ api来读写消息

0、为何使用protobuf?

1、原始内存数据结构,可以以二进制方式sent/saved.这种方式需要相同的内存布局和字节序。
2、以ad-hoc方式将数据项编码成一个简单字符串----比如,将4个int类型编码成"12:3:-23:67"。这种方式简灵活。适用于简单数据。
3、将数据序列化为XML。这种方式很流行,因为xml可读性好,编码解码方便,性能也好。仅仅XML dom树比较复杂。

protobuf可以很好的解决上述问题。你编写一个.proto文件来描述数据结构。protobuf编译器使用它创建一个类,使用二进制方式自动编码/解码该数据结构。生成的类提供getter/setter方法。

最重要的是,protobuf支持在此基础上进行格式扩展。

示例

1、定义协议格式

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; 
}


该结构与c++或java很像.

.proto文件以包声明开始,防止名字冲突。
简单类型:bool, int32, float, double, string.
其它类型:如上述的Person, PhoneNumber

类型可以嵌套。
“=1”, “=2”标识唯一“tag”.tag数1-15需要至少一个字节。

required: 必须设置它的值
optional: 可以设置,也可以不设置
2017-09-13 21:30:20    71    0    0
0.     前期准备
官方protobuf定义

https://code.google.com/p/protobuf/


python使用指南
https://developers.google.com/protocol-buffers/docs/pythontutorial
http://blog.csdn.net/love_newzai/article/details/6906459


安装 python对protobuf的支持

wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2
tar -vxjf protobuf-2.5.0.tar.bz2
cd protobuf-2.5.0
./configure --prefix=/home/admin/mypython/
make ; make install


1     准备.proto文件

struct_oss_pb.proto

message entity_attr
{
    required int32 attr_id 1;            // 属性类型标识,比如:标题属性为 1,正文属性为2,图片属性为 3,发现时间属性为4,原始url属性为5 ,父页面属性为 6;
    required bytes attribute 2;      // 属性类型描述,比如“标题”,“ 正文”,“图片”,“发现时间”,“原始 url”,“父页面 ”等
    repeated bytes value 3;            // 属性值,除“图片”只保留 osskey之外,其他保留原文。考虑到文章中会保留多幅图,所以采用repeated。
};

message entity_desc
{
    required int32 entity_id 1;                           // 实体类型标识,比如:新闻为 1,小说为2 
    required bytes entity_name 2;                  // 实体名称,比如:新闻主题事件关键词,小说名等。
    repeated entity_attr attributes 3;   // 属性描述,格式见entity_attr。
};


2.     将
2017-09-13 21:30:20    117    0    0

1、在.proto文件中定义消息格式

2、使用protobuf编译器
3、使用c++ api来读写消息

0、为何使用protobuf?

1、原始内存数据结构,可以以二进制方式sent/saved.这种方式需要相同的内存布局和字节序。
2、以ad-hoc方式将数据项编码成一个简单字符串----比如,将4个int类型编码成"12:3:-23:67"。这种方式简灵活。适用于简单数据。
3、将数据序列化为XML。这种方式很流行,因为xml可读性好,编码解码方便,性能也好。仅仅XML dom树比较复杂。

protobuf可以很好的解决上述问题。你编写一个.proto文件来描述数据结构。protobuf编译器使用它创建一个类,使用二进制方式自动编码/解码该数据结构。生成的类提供getter/setter方法。

最重要的是,protobuf支持在此基础上进行格式扩展。

示例

1、定义协议格式

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; 
}


该结构与c++或java很像.

.proto文件以包声明开始,防止名字冲突。
简单类型:bool, int32, float, double, string.
其它类型:如上述的Person, PhoneNumber

类型可以嵌套。
“=1”, “=2”标识唯一“tag”.tag数1-15需要至少一个字节。

required: 必须设置它的值
optional: 可以设置,也可以不设置它