Protobuf在Java中的简单使用


系列导航

(一)Protobuf下载和编译
(二)Protobuf在Java中的简单使用


一、编写一个.proto文件

option java_package = "com.proto";
option java_outer_classname = "PersonProto";
message Person {
  required string name = 1;
  required int32 age = 2;
}

1、这里使用的是protobuf 2版本,也就是默认版本,如果需要用到3版本,需要在头部加上 syntax = "proto3"

2、java_package:声明生成的java文件的包名。

3、java_outer_classname:声明生成的java文件的名称。

4、required、optional等在2版本中存在,如果是3版本则不需要写这类前缀内容。


二、生成proto对应的Java类

打开cmd,使用protoc.exe。(需要线安装protobuf)

protoc --java_out=./ person.proto

这时候,如果不出问题将会在当前目录生成一个PersonProto文件。


三、Protobuf使用

(一)和bytes的相互转换

这个可以在网络中传输,双方约定好相同的proto文件,则可以解析出数据。

public class Protobuf2Bytes {
    public static void main(String[] args) {
        PersonProto.Person.Builder builder = PersonProto.Person.newBuilder();
        builder.setName("aa");
        builder.setAge(13);

  		// 转换为bytes
        PersonProto.Person person = builder.build();
        byte[] bytes = person.toByteArray();
        System.out.println(Arrays.toString(bytes));

		// 转换回来后打印数据
        try {
            PersonProto.Person parseFrom = PersonProto.Person.parseFrom(bytes);
            System.out.println(parseFrom.getName());
            System.out.println(parseFrom.getAge());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
}
(一)和json的相互转换

在web的项目中可以尝试使用,但是目前来看还没有大规模的应用。

public class Protobuf2Json {
    public static void main(String[] args) {

        PersonProto.Person.Builder builder = PersonProto.Person.newBuilder();
        builder.setName("aa");
        builder.setAge(13);
        PersonProto.Person person = builder.build();

		// 转json
        JsonFormat.Printer printer = JsonFormat.printer();
        String print = "";

        try {
            print = printer.print(person);
            System.out.println(print);
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }

        // 转回object
        PersonProto.Person.Builder newBuilder = PersonProto.Person.newBuilder();
        JsonFormat.Parser parser = JsonFormat.parser();
        try {
            parser.merge(print, newBuilder);
            System.out.println(newBuilder.build());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值