首页  

protobuf 简介 及 java实例     所属分类 protobuf 浏览量 789
序列化 
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 版本设置