Window下Protobuf Java使用教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010889616/article/details/80246788

        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

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页