欢迎来到天天文库
浏览记录
ID:36045781
大小:190.74 KB
页数:16页
时间:2019-04-30
《protobuf入门》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1.前言这篇入门教程是基于Java语言的,这篇文章我们将会:1.创建一个.proto文件,在其内定义一些PBmessage2.使用PB编译器3.使用PBJavaAPI读写数据这篇文章仅是入门手册,如果想深入学习及了解,可以参看: ProtocolBufferLanguageGuide, JavaAPIReference, JavaGeneratedCodeGuide,以及EncodingReference。2.为什么使用ProtocolBuffers接下来用“通讯簿”这样一个非常简单的应用来举例。该应用能够写入并读取“联系人”信息,每个联系人由name,I
2、D,emailaddress以及contactphotonumber组成。这些信息的最终存储在文件中。如何序列化并检索这样的结构化数据呢?有以下解决方案:1. 使用Java序列化(JavaSerialization)。这是最直接的解决方式,因为该方式是内置于Java语言的,但是,这种方式有许多问题(EffectiveJava对此有详细介绍),而且当有其他应用程序(比如C++程序及Python程序书写的应用)与之共享数据的时候,这种方式就不能工作了。2.将数据项编码成一种特殊的字符串。例如将四个整数编码成“12:3:-23:67”。这种方法简单且灵活,但是却
3、需要编写独立的,只需要用一次的编码和解码代码,并且解析过程需要一些运行成本。这种方式对于简单的数据结构非常有效。3.将数据序列化为XML。这种方式非常诱人,因为易于阅读(某种程度上)并且有不同语言的多种解析库。在需要与其他应用或者项目共享数据的时候,这是一种非常有效的方式。但是,XML是出了名的耗空间,在编码解码上会有很大的性能损耗。而且呢,操作XMLDOM数非常的复杂,远不如操作类中的字段简单。ProtocolBuffers可以灵活,高效且自动化的解决该问题,只需要:1.创建一个.proto文件,描述希望数据存储结构2.使用PBcompiler创建一个类
4、,该类可以高效的,以二进制方式自动编码和解析PB数据该生成类提供组成PB数据字段的getter和setter方法,甚至考虑了如何高效的读写PB数据。更厉害的是,PB友好的支持字段拓展,拓展后的代码,依然能够正确的读取原来格式编码的数据。3.定义协议格式首先需要创建一个.proto文件。非常简单,每一个需要序列化的数据结构,编码一个PBmessage,然后为message中的字段指明一个名字和类型即可。该“通讯簿”的.proto文件addressbook.proto定义如下:packagetutorial;optionjava_package="com.ex
5、ample.tutorial";optionjava_outer_classname="AddressBookProtos";messagePerson{requiredstringname=1;requiredint32id=2;optionalstringemail=3;enumPhoneType{MOBILE=0;HOME=1;WORK=2;}messagePhoneNumber{requiredstringnumber=1;optionalPhoneTypetype=2[default=HOME];}repeatedPhoneNumberphone
6、=4;}messageAddressBook{ repeatedPersonperson=1;}可以看到,语法非常类似Java或者C++,接下来,我们一条一条来过一遍每句话的含义:·.proto文件以一个package声明开始。该声明有助于避免不同项目建设的命名冲突。Java版的PB,在没有指明java_package的情况下,生成的类默认的package即为此package。这里我们生命的java_package,所以最终生成的类会位于com.example.tutorialpackage下。这里需要强调一下,即使指明了java_package,我们建议
7、依旧定义.proto文件的package。·在package声明之后,紧接着是专门为java指定的两个选项:java_package以及java_outer_classname。java_package我们已经说过,不再赘述。java_outer_classname为生成类的名字,该类包含了所有在.proto中定义的类。如果该选项不显式指明的话,会按照驼峰规则,将.proto文件的名字作为该类名。例如“addressbook.proto”将会是“Addressbook”,“address_book.proto”即为“AddressBook”·java指定选
8、项后边,即为message定义。每个message是一个包含了一系
此文档下载收益归作者所有