`

Google protobuf使用向导

    博客分类:
  • Java
阅读更多

本向导讲解了如下内容:

1、在一个.proto文件中定义一个信息格式..

2、使用protocl命令进行编译,生成java代码.

3、使用Java protocol buffer API进行读写操作.

 

以一个地址本为例,从建立一个.proto文件开始,为你想序列化的数据接口加入一个message属性,在message里面,为每一个字段指定名称和类型,下面是一个例子:

package tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

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文件以包声明开始,在java中,除了特别指定一个java_package属性,否则包名一般为Java的包.正像上面的例子.虽然提供了java_package属性,你通常还是应该定义package属性以避免在Protocol Buffers中命名冲突.包声明以后,有两个Java属性:java_package和java_outer_classname.java_package表示生成的Java代码的包,如果没有指定,编译器会根据package属性确定包名..


java_outer_classname属性定义文件中包含的类名.如果没有指定,会根据文件名进行转换,例如:"my_proto.proto"缺省会使用MyProto作为外部类名.

 

下一步,需要定义message属性,一个message是包含了各种类型字段的聚集.有很多标准的变量类型可以使用,包括:bool,int32,float,double和string.你也可以使用其

他的message属性作为字段类型,正像例子中的Person包含了PhoneNumber,而AddressBook包含了Persion,你甚至可以在message内部定义message,例如:PhoneNumber就是在Persion里面定义的.你还可以定义enum类型,正像指定电话号码类型的MOBILE,HOME,WORK..

 

The " = 1", " = 2" markers on each element identify the unique "tag" that field uses in the binary encoding. Tag numbers 1-15 require one less

byte to encode than higher numbers, so as an optimization you can decide to use those tags for the commonly used or repeated elements, leaving

tags 16 and higher for less-commonly used optional elements. Each element in a repeated field requires re-encoding the tag number, so repeated

fields are particularly good candidates for this optimization.
里面的"=1","=2"的唯一标记用于二进制编码,1-15
(上面一段应该是效率的体现,设置编码的,需要在研究一下.)

 

每个字段必须提供一个修饰词:
1、required: 表示字段必须提供,不能为空.否则,message会被认为是未初始化的,识图build为初始化的message会抛出RuntimeException,解析未初始化的message会抛出IOException..除此之外,一个required字段与optional字段完全相同.


2、optional:可选字段,可以设置也可以不设置.如果没有设置,会设置一个缺省值.你可以指定一个缺省值,正像电话号码的type字段,否则,使用系统的缺省值:数字类型缺省为0,字符类型缺省为空串,逻辑类型缺省为false.对于嵌入的message,缺省值通常是message的实例或原型.


3、repeated:字段可以被重复(包括0),可以同于动态大小的数组.

 

编译Protocol Buffers文件
protoc -I=$SRC_DIR --java_out=$DST_DIR addressbook.proto
$DST_DIR:生成的java代码的文件夹
编译成功后,会在指定的目录下生成Java代码文件,包含了对属性的操作,下一步就可以通过API进行数据的读写了...

 

下面的内容还没有看完,下回继续..

 

分享到:
评论

相关推荐

    google protobuf 最新源代码

    google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf ...

    Windows环境使用google protobuf实现简单的例子

    标题中的“Windows环境使用google protobuf实现简单的例子”指的是在Windows操作系统下,利用Visual Studio (VS) 2010开发环境,结合Google的Protocol Buffers(protobuf)版本2.5.0进行简单应用的教程。protobuf是...

    google protobuf的应用

    服务器端与客户端通信,使用google protobuf作为交互数据的序列化工具,其中客户端使用select机制实现I/O复用,服务端使用epoll机制,提高并发连接时的处理效率。软件环境:linux。文件dealpack.cc是服务端和客户端...

    Java protobuf框架使用向导ProtoBuf

    Java protobuf框架使用向导ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范。谷歌自己内部很多程序之间的通信协议都用了ProtoBuf

    Protobuf使用手册.doc

    protobuf 是 Google 开发的一种数据交换格式,用于描述结构化的数据,并能够生成相关的代码以便于序列化和反序列化。protobuf 的主要特点是平台独立、语言独立、可扩展和高效。 二、定义 .proto 文件 在使用 ...

    google protobuf-2.4.1

    在"google protobuf-2.4.1"这个版本中,我们将深入探讨protobuf的核心概念、使用场景、安装过程以及如何在实际项目中应用。 1. **核心概念**: - **数据定义语言(.proto)**:protobuf通过.proto文件定义数据结构...

    protobuf 使用简单示例

    Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python等三种编程语言...

    google protobuf C教程

    通过这个教程,开发者将能够了解并实践在32位单片机上使用Google Protobuf进行数据序列化和通信的全过程,从而提升嵌入式系统之间的数据交换效率和可靠性。阅读"google protobuf移植32位单片机.pdf"文件,将提供更...

    google protobuf-中英文使用手册

    Protocol Buffers(简称protobuf)是Google开发的一种数据序列化协议,它提供了一种灵活、高效、自动化的结构化数据序列化方法,类似于XML、JSON等格式,但更小、更快、更简单。protobuf可以用于各种编程语言,包括...

    google protobuf 源代码

    Google Protobuf(Protocol Buffers)是Google开发的一种数据序列化协议,它允许开发者定义数据结构的格式,并将这些数据高效地编码和解码为二进制格式,适用于跨平台、跨语言的数据交换。Protobuf的设计目标是提高...

    google protobuf-3.2.0 windowsprotoc3.2.0.exe

    protobuf全称是Protocol Buffers,是由Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后将数据编码为二进制格式,用于存储或网络传输。标题中的"google protobuf-3.2.0"指的是protobuf的3.2.0版本,...

    Java_protobuf框架使用向导

    Java Protobuf框架是一种高效的数据序列化工具,由Google开发,被广泛应用于各种系统间的数据交换。它能够将复杂的结构化数据转换为二进制格式,从而实现高效存储和网络传输。在中软卓越内部,Protobuf是用于多个...

    android protobuf 使用demo

    artifact = 'com.google.protobuf:protoc:3.17.3' // 使用的protobuf版本 } generateProtoTasks { all().each { task -> task.builtins { java { option 'lite' // 使用轻量级库,适合Android } } } } } ...

    google protobuf-2.5.0

    protobuf-2.5.0是Google Protocol Buffers(简称protobuf)的一个版本,它是一个高效、灵活的数据序列化库,常用于构建跨平台的通信协议和数据存储格式。Protocol Buffers是一种语言中立、平台中立的机制,可以将...

    java开发Google protobuf 3.2.0 jar包 protobuf-java-3.2.0.jar

    你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。 protobuf-java-3.2.0.jar包 太难找了,只能是自己发布一个jar包 特此分享出来

    google protobuf socket python example

    使用google protobuf通过TCP传输文件

    基于C++的Google Protobuf使用与设计源码教程

    本项目为基于C++的Google Protobuf应用教程,汇集了193个文件,涵盖29个Shell脚本、23个C++源文件、18个SVG图形文件、17个JavaScript...教程内容丰富,旨在帮助开发者深入理解和使用Google Protobuf进行数据序列化。

Global site tag (gtag.js) - Google Analytics