本向导讲解了如下内容:
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进行数据的读写了...
下面的内容还没有看完,下回继续..
分享到:
相关推荐
Java protobuf框架使用向导ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范。谷歌自己内部很多程序之间的通信协议都用了ProtoBuf
Java Protobuf框架是一种高效的数据序列化工具,由Google开发,被广泛应用于各种系统间的数据交换。它能够将复杂的结构化数据转换为二进制格式,从而实现高效存储和网络传输。在中软卓越内部,Protobuf是用于多个...
protobuf是Google开发的一种数据序列化协议,全称为Protocol Buffers。它允许开发者定义数据结构的规范,然后将数据高效地编码和解码为二进制格式,广泛应用于网络通信、数据存储等领域。在Visual Studio 2008这样的...
Eclipse Protobuf是一款由Google开发的数据序列化工具,它允许开发者定义数据结构,然后生成能够轻松在各种数据流中解析和编码这些结构的代码。在本文中,我们将深入探讨如何在Eclipse环境中安装和配置Protobuf,...
<protocArtifact>com.google.protobuf:protoc:3.0.2:exe:${os.detected.classifier} <pluginId>grpc-java <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.1:exe:${os.detected.classifier} ``` 5. 创建`....
7. 部署依赖项:讲解如何处理和部署应用程序的依赖项,例如第三方库和外部组件,如MySql.Data.dll、***.Http.dll、Google.Protobuf.dll等。 8. 打包和分发应用程序:最后,将介绍如何创建安装包(通常是一个 MSI ...
2. 使用Bazel(Google的构建工具)构建TensorFlow C++库: ``` bazel build -c opt //tensorflow:libtensorflow_cc.so ``` 3. 链接生成的动态库到你的C++项目中,确保包含必要的头文件。 总结一下,安装GPU加速...
例如,创建`google.golang.org`和`golang.org`目录,然后分别使用`git clone`命令来克隆`protobuf-go`和`tools`、`crypto`等项目。 7. **创建项目**:在Goland中,新建一个项目,并在项目根目录下手动创建`bin`、`...