Window下Protobuf Java使用教程
Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
一、环境搭建
Google提供了ProtoBuf编译器,可以将配置文件,编译生成代码类。
去Github下载源码:https://github.com/google/protobuf
由于是Window环境,需要下载编译器protoc-3.5.1-win32.zip
将从Github下载的源码protobuf-master.zip解压,我放到了D:\tools\protobuf\protobuf-master目录
然后protoc-3.5.1-win32.zip解压,将bin目录下面的protoc.exe放到D:\tools\protobuf\protobuf-master目录下面的src目录。
此时protoc.exe路径为D:\tools\protobuf\protobuf-master\src\protoc.exe
二、新建Intelidea Java项目
新建Intelidea Java项目,在build.gradle添加依赖,由于使用的protoc.exe是3.5.1版本,protobuf-java使用3.5.1版本。
// https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.5.1'
三、新建test.proto文件
如何编写.proto文件,请参看这篇文章:Protocol Buffers序列化协议及应用
option java_outer_classname = "PersonEntity";//生成的数据访问类的类名
message Person {
required int32 id = 1;//同上
required string name = 2;//必须字段,在后面的使用中必须为该段设置值
optional string email = 3;//可选字段,在后面的使用中可以自由决定是否为该字段设置值
}
#
将生成的test.proto文件,放到工程的目录下面
四、编译生成java类
使用Runtime运行命令,来生成java代码。
命令格式如下:protoc.exe -I=proto的输入目录 —java_out=java类输出目录 proto的输入目录包括包括proto文件
import java.io.IOException;
/**
* Created by wzj on 2018/5/8.
*/
public class ExecProtobuf
{
public static void main(String[] args) throws IOException
{
String strCmd = "D:\\tools\\protobuf\\protobuf-master\\src\\protoc.exe " +
" -I=H:\\JAVA\\protobuf " +
" --java_out=./src/main/java " +
" H:\\JAVA\\protobuf\\test.proto";
Runtime.getRuntime().exec(strCmd);
}
}
执行上面代码会发现,在java目录下面生成了PersonEntity.java类
五、测试
新建ProtobufTest.java类
import java.io.IOException;
/**
* Created by wzj on 2018/5/8.
*/
public class ProtobufTest
{
public static void main(String[] args) throws IOException
{
//模拟将对象转成byte[],方便传输
PersonEntity.Person.Builder builder = PersonEntity.Person.newBuilder();
builder.setId(3);
builder.setName("zhangsan");
builder.setEmail("test@qq.com");
PersonEntity.Person person = builder.build();
System.out.println("before :" + person.toString());
System.out.println("===========Person Byte==========");
for (byte b : person.toByteArray())
{
System.out.print(b);
}
System.out.println();
System.out.println(person.toByteString());
System.out.println("================================");
//模拟接收Byte[],反序列化成Person类
byte[] byteArray = person.toByteArray();
PersonEntity.Person p2 = PersonEntity.Person.parseFrom(byteArray);
System.out.println("after :" + p2.toString());
}
}
执行之后,输出如下:
参考教程:
https://worktile.com/tech/share/prototol-buffers
还没有评论,来说两句吧...