首页 > 基础资料 博客日记

如何在Java中使用protobuf

2025-01-16 06:00:09基础资料围观29

这篇文章介绍了如何在Java中使用protobuf,分享给大家做个参考,收藏Java资料网收获更多编程知识

写在前面

本文看下在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下就可以了。当然也可以自己通过命令行的方式生成Java代码:

格式protoc -I=源地址 --java_out=目标地址 源地址/xxx.proto
接着写一个测试类测试下:

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);
            //转 json
            jsonObject = 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 :入门基础篇,看这篇就够了!

其他版本

3.5.0


文章来源:https://blog.csdn.net/wang0907/article/details/141611005
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云