protobuf 简介 及 java实例
所属分类 protobuf
浏览量 799
序列化
protobuf protostuff thrift hession kryo avro fst msgpack
protobuf
语言无关 平台无关 可扩展 序列化和结构化数据 常用于通信协议,数据存储等
灵活,高效,自动化 ,用于序列化结构化数据,对比于 XML,更小(310倍),更快(20100倍),更简单
两个大版本,proto2 和 proto3
java默认序列化机制 效率极低 不能跨语言
XML 编解码性能消耗 耗内存
json 解析编解码耗时 耗内存
protobuf使用步骤
定义.proto文件
根据.proto生成对应的类文件
序列化操作
proto文件定义 message
字段必须有编号且不允许重复
枚举内部的编号不允许重复,且第一个编号必须为0
同一个 proto 文件中,多个枚举之间不允许定义相同的常量名
各类型默认值
string 空
bytes 空
bools false
数字类型 0
枚举类型 默认为定义的第一个元素,并且编号必须为 0
message 类型 DEFAULT_INSTANCE 空的 message
下载 protobuf-all-3.19.1.zip
./configure
make install
protoc --version
libprotoc 3.19.1
或者 下载 编译好的各个平台的版本
https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.1
protoc-3.19.1-osx-x86_64.zip2.55
protoc-3.19.1-osx-x86_64/bin/protoc
Person.proto
syntax="proto3";
option java_package = "dyyx";
option java_outer_classname = "PersonProto";
message Person {
string name = 1;
int32 age = 2;
}
protoc --java_out=/Users/dugang/tmp Person.proto
dyyx/PersonProto.java
java例子
com.google.protobuf:protobuf-java:3.7.1
PersonProto.Person.Builder builder = PersonProto.Person.newBuilder();
builder.setAge(9);
builder.setName("codefun007.xyz");
PersonProto.Person person = builder.build();
System.out.println("person="+person);
byte[] bytes = person.toByteArray();
// 18 字节 ,相当小了
System.out.println("bytes length "+bytes.length);
// 反序列化
PersonProto.Person person2 = PersonProto.Person.parseFrom(bytes);
System.out.println("person2="+person2);
支持批量生成
cd /PATH/proto
protoc --java_out=/Users/dugang/tmp *.proto
完整例子代码
https://gitee.com/dyyx/hellocode/blob/master/demo/protobufdemo/src/main/java/dyyx/ProtoDemo.java
上一篇
下一篇
scala future mapTo 用法
scala强制类型转换
scala成员访问修饰符
scala包对象实例
quarkus 例子项目
idea jdk 版本设置