写在前面
本文看下在Java中如何使用protofbuf。
1:介绍
1.1:什么是protobuf
是一种数据格式,同json,xml,等。但是一种二进制数据格式。
1.2:强在哪里?为啥要用?
小,比json,xml等小3~10倍左右。
快,解析的速度比xml,json等快20~100倍。
小,意味着可以有更低的网络传输延迟。
快,程序也会有更高的性能。
最终有更小的rt。
2:正戏
- 环境
win,protobuf 3.0.0。
2.1:基础准备
首先在这里下载安装包,之后解压即可,接着配置下环境变量。然后主要就是设置idea了。首先下载插件:
接着创建一个测试项目,pom:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>proto</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- protobuf 支持 Java 核心包--><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId>
<!-- <version>3.15.3</version>--><version>3.0.0</version></dependency><!-- proto 与 Json 互转会用到--><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util</artifactId>
<!-- <version>3.15.3</version>--><version>3.0.0</version></dependency></dependencies>
</project>
然后创建一个proto文件,如下:
//使用 proto3 语法 ,未指定则使用proto2
syntax = "proto3";//生成 proto 文件所在包路径
package com.dahuyou.protobuf;//生成 proto 文件所在包路径
option java_package = "com.dahuyou.protobuf.proto";//生成 proto 文件名
option java_outer_classname="DemoProto";message Demo {//自身属性int32 id = 1;string code = 2;string name = 3;
}
接着生成对应的针对文件解析的Java代码:
将生成的文件拷贝到src/java下就可以了。
接着写一个测试类测试下:
package com.dahuyou.protobuf.proto;import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;import java.util.Arrays;public class SimpleTestMain {public static void main(String[] args) {//初始化数据DemoProto.Demo.Builder demo = DemoProto.Demo.newBuilder();demo.setId(1).setCode("001").setName("张三").build();//序列化DemoProto.Demo build = demo.build();//转换成字节数组byte[] s = build.toByteArray();System.out.println("protobuf数据bytes[]:" + Arrays.toString(s));// protobuf的大小是15字节,而json的大小是50字节,protobuf大小只是json的四分之一左右System.out.println("protobuf序列化大小: " + s.length);DemoProto.Demo demo1 = null;String jsonObject = null;try {//反序列化demo1 = DemoProto.Demo.parseFrom(s);//转 jsonjsonObject = JsonFormat.printer().print(demo1);} catch (InvalidProtocolBufferException e) {e.printStackTrace();}System.out.println("Json格式化结果:\n" + jsonObject);// json的大小的50个字节,而protobuf的大小是15个字节,大了将近4倍System.out.println("Json格式化数据大小: " + jsonObject.getBytes().length);}
}
运行:
可以看到protobuf比json小了将近4倍,比xml的话就更多了。
done!!!
写在后面
参考文章列表
Protobuf 是啥以及为啥要用它 。
Java 中使用 protobuf :入门基础篇,看这篇就够了! 。