2

我看了很多教程,但我不明白如何使用协议缓冲区

为什么是“消息用户”?为什么不“类用户”?以及 Eclipse 是如何创建这样的消息的?为什么 name = 2 ?不是名称=“最大”

ption java_outer_classname="ProtoUser";

message User {

   required int32  id = 1;  // DB record ID
   required string name = 2;
   required string firstname = 3;
   required string lastname = 4;
   required string ssn= 5; 



   // Embedded Address message spec

    message Address {
      required int32 id = 1;
      required string country = 2 [default = "US"];; 
      optional string state = 3;
      optional string city = 4;
      optional string street = 5;
      optional string zip = 6;



      enum Type {
         HOME = 0;

         WORK = 1; 

       }

       optional Type addrType = 7 [default = HOME]; 

 }
   repeated Address addr = 16;
}
4

2 回答 2

4

为什么是“消息用户”?为什么不“类用户”?

Google Protocol Buffers (GPB)class在其语法中没有,而是有messagehttps://developers.google.com/protocol-buffers/docs/style

这个文件只是文本文件,它应该有.proto扩展名。毕竟,您将在其上运行一个实用程序,该实用程序将生成真正的 Java 类,您可以将其导入并在您的项目中轻松使用。

https://developers.google.com/protocol-buffers/docs/javatutorial

编译你的协议缓冲区

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

required string lastname = 4;

4 代表字段 id,而不是值,它将用于生成比特流。

于 2013-03-14T15:12:28.983 回答
0

Protobuffer 使用 message(keyword) 而不是 class 在你定义结构的类里面。架构。例如

 message Person{
  string name = 1;
  repeated string id = 2;
  Type phoneType = 3;
 }

enum Type{
 CellPhone = 0;
 HomePhone = 1;
 }

在上面的例子中,我们定义了 Person Message 的结构。它的名称是数据类型是字符串,id 是字符串和类型的数组(当您只期望某些值时,请使用枚举。在这种情况下,我们假设 phoneNumber 可以是 CellPhone 或 HomePhone。如果有人正在发送任何其他值,然后 IT 将通过 UNKNOWN proto 值异常)

required:表示参数是必需的

要使用 proto 首先使用 mvn clean install 创建 proto 类 然后创建 protobuilder Protobuilder 为上面的 proto 设置

 Person person = Person.newBuilder().setName("testName")
 .setPhoneType(Type.CellPhone)
 .addAllId(listIds)
 .build;

一旦你设置了这个值,你就不能改变它。如果要更改值,则需要创建另一个原型。Pesron person1 = Person.newBuilder(person).setName("ChangeName").build;

person1 将具有名称 ChangeName、phoneType CellPhone 和 ids 字符串数组。

更多信息: https ://developers.google.com/protocol-buffers

于 2021-03-22T04:24:17.543 回答