protobuf的使用 java demo

protobuf

1.什么是protobuf

我们先来看看官方文档给出的定义和描述:

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

简单来讲, ProtoBuf 是结构数据序列化[1] 方法,可简单类比于 XML[2],其具有以下特点:

  • 语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
  • 高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
  • 扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序

序列化[1]:将结构数据对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够被重建回原来的结构数据或对象。
更为详尽的介绍可参阅 维基百科
类比于 XML[2]:这里主要指在数据通信和数据存储应用场景中序列化方面的类比,但个人认为 XML 作为一种扩展标记语言和 ProtoBuf 还是有着本质区别的。

2.使用protobuf

下载安装,因为我是ubuntu系统,直接输入命令行protoc 然后根据提示安装;

使用protobuf,首先需要定义一个.proto文件

syntax = "proto3";//定义版本

option java_package = "com.example.protobufDemo.model"; //定义生成的文件包路径
option java_outer_classname = "RtaRequestModel"; //定义类名 缺失则给一个默认值

message RtaRequest {
// 请求唯一标识
 string id = 1;
 bool is_ping = 2;
 bool is_test = 3;

enum OperatingSystem {
 OS_UNKNOWN = 0;
OS_IOS = 1;
OS_ANDROID = 2;
OS_WINDOWS = 3;
OS_SYMBIAN = 4;
 OS_JAVA = 5;
}

message Device {
  OperatingSystem os = 1;
  string idfa_md5sum = 2;
    string imei_md5sum = 3;
  string android_id_md5sum = 4;
 }
 Device device = 5;
}

使用方法最简单的是下载一个protobuf编译器,然后使用命令编译.proto文件,java命令是

-OptiPlex-7050:~/下载$ protoc RtaRequest.proto --java_out=.

编译生成文件到当前目录,其他系统参考下文,

工具编译 protoc.exe --java_out=编译的路径 源

java编译
F:\工具\portobuf>protoc.exe --java_out=F:\工具\portobuf\ SubscribeReq.proto

 生成的java文件很长,可能引入idea里面还会报错,不过没关系,不影响

        RtaRequestModel.RtaRequest rtaRequest = RtaRequestModel.RtaRequest.newBuilder()
                .setId("ukId")
                .setIsPing(true)
                .setIsTest(true)
                .setDevice(RtaRequestModel.RtaRequest.Device.newBuilder()
                        .setOs(RtaRequestModel.RtaRequest.OperatingSystem.OS_IOS)
                        .setIdfaMd5Sum("ttttt")
                        .setIp("127.0.0.1")
                        .build())
                .build();
        System.out.println(rtaRequest);
        byte[] sss = rtaRequest.toByteArray();

但是,这样手动去生成类文件再添加进来很笨重,还有一种简单的办法,那就是使用 Protobuf support,idea可以直接搜索安装。结合mvn可以自动编译.proto文件,我们只需要在文件中制定类名和包,mvn会自动编译生成class文件,这个时候遇到一个问题,因为虽然class文件有了,编译可以通过,但是因为我们引用不到类,所以会有红色波浪线,我们可以如图,选中java文件夹,右键Mark Directory as 

还有一点,如果proto中字段是默认值的话,打印是不会显示该字段的,可以直接get获取值。

另另另外,上面第二种方法,我们在使用的时候还可以不放在项目里面,直接打成一个jar包来使用 ,这样更好一点。

详情请见git  正在整理ing

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值