如何在Java中使用protobuf

news2024/9/21 4:20:35

写在前面

本文看下在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);
            //转 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 :入门基础篇,看这篇就够了! 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图新说-调整标绘线面的压盖顺序的两种方法

0.序 图新说作为一个三维可视化汇报工具&#xff0c;在公安消防领域常用于做态势标绘&#xff0c;应急救援方案&#xff0c;安保预案等。 如果撤离路线&#xff0c;或者行进路线【线对象】经过了水源地、危险区等【面对象】。如何确保线对象显示在面对象的上面&#xff0c;不被…

MyBatis中的占位符解析机制

深入理解 MyBatis 中的 #{} 占位符解析机制 在使用 MyBatis 进行数据库操作时&#xff0c;#{} 占位符是我们非常常用的一个特性。它能够将 Java 对象的属性值与 SQL 语句中的参数进行映射。在实际使用中&#xff0c;MyBatis 如何解析 #{} 占位符并获取对应的属性值呢&#xff…

如何实现低成本降噪?风扇噪声流体仿真解决方案

本文将说明工程师如何能够使用气动解决方案来模拟和降低一款小型发电机柜冷却风扇的噪音。ultraFluidX 的模拟结果将设备内部的流场和声场可视化&#xff0c;研究风扇和机柜内其他部件的相互作用&#xff0c;确认噪声源来自何处&#xff08;协助工程师采取有效的降噪措施&#…

Mybatis中的缓存

一&#xff0c;为什么要使用缓存 1&#xff0c;缓存的作用 缓存(cache&#xff09;的作用是为了减去数据库的压力&#xff0c;提高查询性能。 缓存实现的原理是 从数据库中查询出来的对象在使用完后不要销毁&#xff0c;而是存储在内存&#xff08;缓存&#xff09; 中&#…

zipkin启动发生报错 : Failed to start bean ‘armeriaServerGracefulShutdownLifecycle‘;

报错详情 : 在windows下启动zipkin的时候发生报错 : Failed to start bean ‘armeriaServerGracefulShutdownLifecycle’;nested exception is java.util.concurrent.CompletionException: java.lang.IllegalStateException: Armeria server failed to start解决 : 由于z…

SSM网上书店--附源码96453

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上书店当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上书店&#xff0c;它彻底改变了过去传统的管理方式…

安装cvxpy时遇到“subprocess-exited-with-error”的解决方式

尝试联邦学习时&#xff0c;遇到了这个问题&#xff0c;但实际上仔细看报错就能找到源头 ①更新cmake版本到3.17 参考此文即可更新 https://blog.csdn.net/why1249777255/article/details/138505546 【报错点中“Found CMake:…………”这一行&#xff0c;在不满足要求时会说…

信息学奥赛一本通编程启蒙(不断更新ing~)

可以作为c初学者的练习题&#xff0c;我会挑选有部分有代表意义的题目作为学生的课后作业&#xff0c;后面会在专栏中陆续更新题目解析&#xff0c;并附在这一篇文章的链接中 信息学奥赛一本通-编程启蒙&#xff08;C版&#xff09;在线评测系统 https://bas.ssoier.cn/index…

安全升级,智启未来!广东工业安全生产数智化转型闭门分享会圆满举办

8月26日&#xff0c;由华为技术有限公司&#xff08;以下简称“华为”&#xff09;与广州英码信息科技有限公司&#xff08;以下简称“英码科技”&#xff09;联合主办&#xff0c;广东省应急产业协会为支持单位的“广东工业安全生产数智化转型闭门分享会”在广州圆满举行。本次…

整合优化方案即将批复,您准备好了吗?

在自然保护地管理的新时代&#xff0c;规划编制的复杂性和高要求常常让各级管理者和规划者面临重重挑战。整合优化方案即将批复&#xff0c;规划任务将十分繁重&#xff01;为了应对这些难题&#xff0c;“自然保护地总体规划智能编制系统”应运而生&#xff0c;旨在为规划编制…

iPhone短信误删如何恢复,四种方法找回短信

在日常使用手机的过程中&#xff0c;我们可能会因为误操作或其他原因不小心删除了重要的短信。这些短信可能包含了工作沟通、家人关怀或朋友间的温馨对话&#xff0c;一旦丢失&#xff0c;难免让人感到焦虑和不安。不过&#xff0c;别担心&#xff0c;针对iPhone短信误删的问题…

Java开发者的专业显示器推荐-明基RD280U

哈喽&#xff0c;小伙伴们好呀&#xff0c;我混编程界已经好几年了&#xff0c;搞了这么多年的Java&#xff0c;换了好几家公司&#xff0c;有的公司发电脑&#xff0c;有的公司发笔记本&#xff0c;有的还发主机&#xff0c;不过你们有没有注意到一个普遍的问题&#xff0c;公…

金融工程--基于akshare的数据获取

背景 在进行金融工程和量化交易的时候&#xff0c;如何获取准确的数据来为我们模型和后期的判断提供支撑和依据成为了比较关键的一个点。对这个问题有几个方面的要求。第一&#xff0c;获取的数据的准确性&#xff0c;第二&#xff0c;大批量数据获取的接口稳定程度&#xff0…

Trivy 工具:开启高效漏洞检测之旅

在网络安全日益重要的今天&#xff0c;及时发现系统和应用中的漏洞成为了保护企业和个人信息安全的关键。而 Trivy 工具&#xff0c;就如同您手中的一把利剑&#xff0c;能够精准地刺破漏洞的伪装&#xff0c;为您的网络世界保驾护航。 Trivy 是一款功能强大、易于使用且开源的…

信息学奥赛初赛天天练-76-NOIP2015普及组-基础题1-计算机存储、硬件系统、操作系统、进制转换、二进制加法

NOIP 2016 普及组 基础题1 1 1MB 等于 ( ) A 10000 字节 B 1024 字节 C 10001000 字节 D 10241024 字节 2 在 PC 机中&#xff0c;PENTIUM&#xff08;奔腾&#xff09;、酷睿、赛扬等 是指( ) A 生产厂家名称 B 硬盘的型号 C CPU 的型号 D 显示器的型号 3 操作系统的作用是…

关于用列表append字典数据却一直重复问题

关于python用列表append字典数据却一直重复问题 用列表append添加字典数据却一直重复最后一个理解了上面的内容之后&#xff0c;我们再回到最初的问题解决方法 用列表append添加字典数据却一直重复最后一个 以下是我们的代码&#xff1a; def parse_data(data):parse_dict d…

卡在恢复模式怎么办?这样操作一键轻松退出iPhone 恢复模式

iOS 18beta版本发布后&#xff0c;已经成功升级到iOS 18beta并享受新功能的小伙伴们真是太幸运了。但是还有一些小伙伴在更新iOS 18beta的过程中遇到了各种问题&#xff0c;比如iPhone卡在恢复模式是常见问题。如果你也遇到此问题&#xff0c;不要着急&#xff0c;接下来我们将…

qt生成uid

QUuid 是 Qt 库中的一个类&#xff0c;用于生成和处理全局唯一标识符&#xff08;UUID&#xff09;。UUID 是一种128位的标识符&#xff0c;通常用于唯一标识对象&#xff0c; #include <QUuid> QString uid QUuid::createUuid().toString(QUuid::WithoutBraces);QUuid…

自动生成文章的软件,提升文章写作体验非常棒

在这个信息时代&#xff0c;文章写作是少不了的&#xff0c;然而文章写作对于每个人来说却是一件耗时费力的事情&#xff0c;但随着技术的发展&#xff0c;自动生成文章的软件的出现让文章写作变得尤为简单&#xff0c;它不仅可以节省大家的写作时间&#xff0c;而且还能提高写…

专门康复自闭症儿童学校哪里有?

在探索自闭症儿童康复教育的道路上&#xff0c;家长们总是希望为孩子找到最专业、最可靠的康复机构。在众多选择中&#xff0c;广州市星贝育园康复中心以其独特的优势和显著的康复效果脱颖而出&#xff0c;成为了成为众多家庭信赖的自闭症儿童康复学校。 星贝育园康复中心&…