python读写protobuf

本文介绍了protobuf的基本概念,包括官方定义、python使用指南及安装步骤,并详细展示了如何使用.proto文件进行数据描述与序列化。重点阐述了protobuf的优缺点,如体积小、速度快、简单易用以及兼容性好等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.     前期准备
官方protobuf定义
https://code.google.com/p/protobuf/

python使用指南
https://developers.google.com/protocol-buffers/docs/pythontutorial
http://blog.youkuaiyun.com/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.     将proto转化为 xxx_pb2.py ,然后在你的程序里import这个py

protoc  ./struct_oss_pb.proto  --python_out=./

得到struct_oss_pb_pb2.py


3.     读写protobuf的示例python
if __name__ == '__main__':
    entitydesc = struct_oss_pb_pb2.entity_desc()
    entitydesc.entity_id = 1
    entitydesc.entity_name = 'haha'
    #create proto
    entityattr = entitydesc.attributes.add()
    entityattr.attr_id = 11
    entityattr.attribute = 'title'.decode('gbk').encode('utf-8')
    entityattr.value.append("title adfadf")
    print entitydesc
    print entityattr




Protobuf 的优点

Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。

它有一个非常棒的特性,即“向后”兼容性好,人们不必破坏已部署的、依靠“老”数据格式的程序就可以对数据结构进行升级。这样您的程序就可以不必担心因为消息结构的改变而造成的大规模的代码重构或者迁移的问题。因为添加新的消息中的 field 并不会引起已经发布的程序的任何改变。

Protobuf 语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。

使用 Protobuf 无需学习复杂的文档对象模型,Protobuf 的编程模式比较友好,简单易学,同时它拥有良好的文档和示例,对于喜欢简单事物的人们而言,Protobuf 比其他的技术更加有吸引力。

Protobuf 的不足

Protbuf 与 XML 相比也有不足之处。它功能简单,无法用来表示复杂的概念。

XML 已经成为多种行业标准的编写工具,Protobuf 只是 Google 公司内部使用的工具,在通用性上还差很多。

由于文本并不适合用来描述数据结构,所以 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。另外,由于 XML 具有某种程度上的自解释性,它可以被人直接读取编辑,在这一点上 Protobuf 不行,它以二进制的方式存储,除非你有 .proto 定义,否则你没法直接读出 Protobuf 的任何内容【 2 】。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值