protobuff
一、简介
protobuf是google的一种轻便高效的结构化数据存储格式,作用形同于xml、json,它独立于语言,独立于平台。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
二、编译proto文件成java类
编译可以在多个平台上操作需要下载对应的编译程序,下载地址:https://github.com/protocolbuffers/protobuf/releases,建议使用3.1.0以上的版本进行编译和开发,proto3版本中,已经没有了"required"关键字,所有字段默认都是optional,即可以为空。但是3.1.0到3.6.0版本没有window系统的编译器。 本文使用的window版编译器是这个版本protoc-3.7.0-win64.zip,linux版编译器是这个版本protoc-3.1.0-linux-x86_64.zip
- proto文件示例
syntax = "proto3";
package com.demo.proto;
option java_outer_classname = "RequestProto";
message RtaRequest {
string req_id = 1;
OsType os_type = 2; // 操作系统类型
Device device = 3; // 设备号的 md5, 安卓为 md5(imei),ios 为 md5(idfa)
enum OsType {
UNKNOWN = 0; // 位置类型
ANDROID = 1; // ANDROID
IOS = 2; // IOS
}
}
message Device {
string imei_md5 = 1; // md5 后的 imei
string idfa_md5 = 2; // md5 后的 idfa
string oaid = 3; // oaid 原值
Udid udid = 4; // 唯一设备标识caid原值
}
message Udid {
string current_caid = 1; // 当前caid
string current_caid_version = 2; // 当前caid版本
string last_caid = 3; // 上一版本caid
string last_caid_version = 4; // 上一版本caid版本
}
- linux下编译
# 下载编译工具并且解压
unzip protoc-3.1.0-linux-x86_64.zip -d protoc-3.1.0
# 进行编译,先cd到protoc-3.1.0/bin目录下,再执行
protoc -I=定义的proto文件目录 --java_out=编译后的文件目录 定义的proto文件全路径
# 例如
protoc -I=/root/lrl/protofile --java_out=/root/lrl/compliedata /root/lrl/protofile/demo.proto
- window下编译使用(使用git bash或者复制命令cmd执行)
#!/bin/bash
# 设置protobuf编译器路径(如果不在PATH中)
PROTOC_BIN="D:/code/protoc-3.7.0-win64/bin/protoc.exe"
# 设置项目根目录
PROJECT_ROOT="D:/code/serving/api"
# 设置.proto文件所在目录
PROTO_DIR="$PROJECT_ROOT/docs/proto"
# 设置输出Java类的目标目录
JAVA_OUT="$PROJECT_ROOT/src/main/java"
# 编译
$PROTOC_BIN \
--java_out $PROJECT_ROOT/src/main/java \
--proto_path $PROJECT_ROOT/docs/proto/ \
$PROJECT_ROOT/docs/proto/demo.proto
三、编译后的文件在java项目中使用
- 项目中引入对应版本的jar包比如protobuf-Java-3.7.0.jar,注意jar包的版本需要和上面使用的编译器一个版本
- 前面编译好的java文件复制到项目中,然后进行操作
public static void main(String[] args) {
var req = RtaRequest.newBuilder()
.setReqId("**")
.setDevice(Device.newBuilder().setOaid("**"))
.setOsType(RtaRequest.OsType.IOS)
.build();
}