Google PB协议学习记录--一个简单的例子--如何编译.proto文件为.java文件


步骤一, 书写 .proto 文件,这里直接上google官方实例,并存储为addressbook.proto


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;
}


步骤2、下载.proto文件编译器

到protobuf发布版本的地方https://github.com/google/protobuf/releases下载 protoc-3.1.0-win32.zip并解压



通过命令行将.proto的文件生成为.java的文件
官网上是这样写的
protoc    -I=$SRC_DIR      --java_out=$DST_DIR        $SRC_DIR/addressbook.proto

下面直接来看具体操作

1、由于protoc.exe在bin文件夹下,所以先进入该目录

2、执行 protoc.exe   --java_out=./     addressbook.proto   命令

3、在当前目录下就会生成目标文件






下面来解释下命令行的意思

protoc      --proto_path=IMPORT_PATH        --cpp_out=DST_DIR                            file.proto
                                                                          --java_out=DST_DIR 
                                                                          --python_out=DST_DIR          

1.引用文件夹(使用--proto_path  或者 -I),如果proto文件中需要引用其他文件,在这指定(需要绝对路径,也就是需要完整的路径)

IMPORT_PATH 引用的路径:当pb文件里面有import关键字时,会在引用路径里面寻找依赖的文件。如果没有给出,会再当前路径下进行寻找。也可以缩写成 -I

2.文件输出文件夹  (--cpp_out 或者 --java_out 或者 --python_out) 根据需要选择需要生成的格式,并且指定文件夹

3.需要编译的pb文件




当然,我可以给你一个例子。下面是一个使用Java实现pb序列化与反序列化的示例: 首先,你需要定义一个proto文件来描述你的数据结构。假设你的数据结构是一个简单的消息对象,包含一个字符串字段和一个整数字段,你可以创建一个名为message.proto的文件,内容如下: ```protobuf syntax = "proto3"; message Message { string content = 1; int32 id = 2; } ``` 接下来,你需要使用protobuf编译器将proto文件编译Java类。你可以在命令行中使用以下命令: ``` protoc --java_out=<output_directory> message.proto ``` 其中,`<output_directory>`是你希望生成Java类的输出目录。 编译完成后,你将获得一个名为Message.javaJava类,该类对应于你在proto文件中定义的消息对象。 现在,你可以在Java代码中使用这个生成的类来进行序列化和反序列化。以下是一个简单的示例: ```java import com.google.protobuf.InvalidProtocolBufferException; public class PbSerializationExample { public static void main(String[] args) { // 创建一个Message对象 MessageProtos.Message message = MessageProtos.Message.newBuilder() .setContent("Hello, protobuf!") .setId(123) .build(); // 将Message对象序列化为字节数组 byte[] serializedMessage = message.toByteArray(); // 将字节数组反序列化为Message对象 try { MessageProtos.Message deserializedMessage = MessageProtos.Message.parseFrom(serializedMessage); System.out.println("Content: " + deserializedMessage.getContent()); System.out.println("ID: " + deserializedMessage.getId()); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们首先创建一个Message对象,并设置它的字段值。然后,我们使用`toByteArray()`方法将Message对象序列化为字节数组。接下来,我们使用`parseFrom()`方法将字节数组反序列化为Message对象,并打印出其中的字段值。 请确保你已经添加了protobuf库的依赖,例如在Maven项目中可以在pom.xml文件中添加以下依赖: ```xml <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.17.3</version> </dependency> </dependencies> ``` 这就是一个简单Java实现pb序列化与反序列化的例子。希望对你有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值