序列化工具Protobuf在Idea中的配置和在java中的使用实例

news2024/11/18 5:53:56

一、什么是 protobuf ?

  • 1、protobuf 来源?
    Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。
    由于protobuf是跨语言的,所以用不同的语言序列化对象后,生成一段字节码,之后可以其他任何语言反序列化并自用,大大方便了跨语言的通讯,同时也提高了效率。
    具体参考文档: https://blog.csdn.net/wxw1997a/article/details/116755542
  • 2、为什么要使用Protobuf
    java中主要是netty使用的编解码方面
    Netty 提供的编码器
    StringEncoder,对字符串数据进行编码
    ObjectEncoder,对 Java 对象进行编码

    Netty 提供的解码器
    StringDecoder, 对字符串数据进行解码
    ObjectDecoder,对 Java 对象进行解码

Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术 , 而Java 序列化技术本身效率就不高,存在如下问题:
1.无法跨语言
2.序列化后的体积太大,是二进制编码的 5 倍多。
3.序列化性能太低
4.Protobuf 是以 message (信息)的方式来管理数据的.
5.支持跨平台、跨语言,即[客户端和服务器端可以是不同的语言编写的] (支持目前绝大多数语言,例如 C++、C#、Java、python 等)
6.高性能,高可靠性
7.使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述。说明,在idea 中编写 .proto 文件时,会自动提示是否下载 .ptotot 编写插件. 可以让语法高亮。
8.然后通过 protoc.exe 编译器根据.proto 自动生成.java 文件

参考文档:https://www.cnblogs.com/Courage129/p/14266738.html
二、IDEA安装Protobuf
依次点击Intellij中的“File”>"Settings>“Plugins”==>“Browse repositories”,输入Protobuf,点击install:
如果没有找到,先进入官方地址下载插件:protobuf插件
百度网盘:链接:https://pan.baidu.com/s/1V2fs4SEMU3hYJfQo-SQEpg
提取码:prot
参考文档: https://www.cnblogs.com/liugh/p/7505533.html
三、protobuf的简单使用
这里只介绍使用maven方式生成java文件
1、pom.xml文件配置

	<properties>
		<java.version>1.8</java.version>
		<grpc.version>1.50.2</grpc.version>
		<protobuf.version>3.21.9</protobuf.version>
	</properties>
<dependency>
			<groupId>com.google.protobuf</groupId>
			<artifactId>protobuf-java</artifactId>
			<version>${protobuf.version}</version>
		</dependency>
		<dependency>
			<groupId>com.google.protobuf</groupId>
			<artifactId>protobuf-java-util</artifactId>
			<version>${protobuf.version}</version>
		</dependency>
		<dependency>
			<groupId>io.grpc</groupId>
			<artifactId>grpc-netty</artifactId>
			<version>${grpc.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>io.grpc</groupId>
			<artifactId>grpc-protobuf</artifactId>
			<version>${grpc.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>io.grpc</groupId>
			<artifactId>grpc-stub</artifactId>
			<version>${grpc.version}</version>
			<scope>provided</scope>
		</dependency>

2、在src->main下创建目录proto,这是我编译的时候发现在src/main下找不到proto目录,具体目录位置是否可修改还不清楚
在这里插入图片描述
在proto目录下创建demo.proto文件,内容为

//使用 proto3 语法 ,未指定则使用proto2
syntax = "proto3";

//生成 proto 文件所在包路径
package com.wang.testproto.proto;

//生成 proto 文件所在包路径
option java_package = "com.wang.testproto.proto";

//生成 proto 文件名
option java_outer_classname="DemoProto";

message Demo{
  //自身属性
  int32 id = 1;
  string code = 2;
  string name = 3;
}

3、在pom.xml文件中配置插件

<build>
		<extensions>
			<extension>
				<groupId>kr.motd.maven</groupId>
				<artifactId>os-maven-plugin</artifactId>
				<version>1.5.0.Final</version>
			</extension>
		</extensions>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>org.xolstice.maven.plugins</groupId>
				<artifactId>protobuf-maven-plugin</artifactId>
				<version>0.5.0</version>
				<configuration>
					<protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
					<pluginId>grpc-java</pluginId>
					<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>compile</goal>
							<goal>compile-custom</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

然后在maven的plugins中就会有protobuf项
在这里插入图片描述
点击 protobuf:compile后自动编译生成java文件,注意生成的文件不会自动的放入规定的包中,一般在target下,需要手动拷贝到所需的包内
如图:在这里插入图片描述
4、protobuf序列化和反序列化的具体使用

package com.wang.testprotobuf;

import com.google.protobuf.InvalidProtocolBufferException;
import com.wang.testprotobuf.proto.DemoProto;
import com.google.protobuf.util.JsonFormat;

import java.util.Arrays;

/**
 * created by jasonwang
 * on 2022/12/5 17:23
 */
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));
        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);
        System.out.println("Json格式化数据大小: " + jsonObject.getBytes().length);
    }
}

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

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

相关文章

5G无线技术基础自学系列 | 5G上下行解耦技术

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 C-Band TDD系统拥有大带宽&#xff0c;…

Spring Boot 3.0 正式发布

导读Spring Boot 3.0 现已正式发布&#xff0c;此版本包含了 12 个月以来 151 个人的 5700 多次 commit 的工作结晶。这是自 4.5 年前发布 2.0 以来&#xff0c;Spring Boot 的第一次重大修订。它也是第一个支持 Spring Framework 6.0 和 GraalVM 的 Spring Boot GA 版本。 由于…

Windows10安装DM8-达梦数据库

目录1. 下载安装包1.1 点击官网下载DM8安装包1.2 安装包解压2. 安装数据库2.1 打开解压后的文件夹&#xff0c;双击打开该iso文件2.2 点击setup.exe进行安装2.3 选择语言2.4 执行安装向导2.5 数据库初始化3. SQL交互查询工具验证数据库安装4. 参考文档及简单的试炼5.DM管理工具…

System.UnauthorizedAccessException: 对路径“xxx”的访问被拒绝的解决办法

环境&#xff1a;.net、spring.core、C#、MVC、IIS 8、Windows server standard 2016 操作&#xff1a;读取本地文件夹 现象&#xff1a;爆出如标题异常&#xff0c;因为是在后台调用接口处理本地文件(夹)&#xff0c;前端相关接口显示500 Internal Server Error。 简单理解…

将“万词王”离线转化为“文络之心“插件之一:复现 wantwords Python/Pytorch 开源项目

在电影里&#xff0c;无限之书&#xff0c;每一页都是不一样的内容。简单的随机算法其实有点无聊&#xff0c;但借助深度学习技术&#xff0c;化王为心&#xff0c;实现心灵大道的转换&#xff0c;可以让AI生成相互之间有所关联的无限词典之书&#xff01; 访问 wantwords开源…

python @ 装饰器(修饰器,语法糖)使用与不使用对比总结记录

由于看python代码里面函数上的 不爽很久了&#xff0c;为了避免自己又忘记了这里来记录下。 简单总结&#xff1a; 的作用就是在使用 下面的函数&#xff08;如下图的cs2&#xff09;的时候&#xff0c;会在该函数执行前将该函数作为参数扔到后跟着的处理函数先行处理&#x…

再见 Spring Boot 1.X ,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维护到2019年8月1日。 1.5.x 将会是 Spring Boot 1.0 系列的最后一个大版本。 如今…

[附源码]计算机毕业设计停车场管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

uniapp——uniapp基础知识

文章目录前言一、HBuilderX常用的快捷键&#xff1f;二、项目中的目录二、项目中的目录总结前言 提示&#xff1a;从0开始学习uniapp&#xff1a; uniapp 解决了什么问题&#xff1f; 1解决了跨端的问题&#xff0c;一端多用。并且可以通过条件编译来实现&#xff0c;不同平台…

【allegro 17.4软件操作保姆级教程九】布线后检查与调整

目录 1.1 PCB状态查看 1.2 添加背钻 1.3 隐藏铜皮检查走线 1.5 位号丝印调整 1.6 使用cut功能删除不需要的电气走线或非电气走线 1.7 走线参考层快速检查 1.8 添加MARK点 1.9 添加工艺边 1.10 尺寸标注 1.1 PCB状态查看 点击display-status可以查看状态&#xff1a; 各…

Spark VS Flink,大数据该学什么

Spark VS Flink&#xff1a;功能比较 Spark和Flink中的功能集在很多方面都不同&#xff0c;如下表所示&#xff1a; Flink特点 支持高吞吐、低延迟、高性能的流处理 有状态计算的Exactly-once语义&#xff0c;对于一条message,receiver确保只收到一次 支持带有事件时间&…

超声功率放大器在MEMS超声测试中的应用

MEMS&#xff08;微机电系统&#xff09;技术的不断发展&#xff0c;目前已经广泛应用在生物、航空、医学、航天等多领域。MEMS传感器即微机电系统&#xff08;Micro-electroMechanicalSystems&#xff09;&#xff0c;是指精密机械系统和微电子电路技术结合发展出来的一项工程…

一文800字手把手教你使用Docker实现分布式Web自动化

01、前言 顺着docker的发展&#xff0c;很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试&#xff0c;这篇文章主要讲述在docker中使用浏览器进行自动化测试如果可以实现可视化&#xff0c;同时可以对浏览器进行相关的操作。 02、开篇 首先我们先…

在RVIZ中进行可视化操作

文章目录可视化图片catkin新建工程主函数代码cmakelists.txt编译和运行在rviz中显示可视化realsense安装realsense SDK在ROS中安装realsense在rviz中显示参考可视化图片 catkin新建工程 mkdir -p rosopencv/srccd rosopencv/srccatkin_create_pkg rosopencv sensor_msgs cv_br…

Python中正则表达式的使用

正则表达式就是从字符串中发现规律&#xff0c;并通过“抽象”的符号表达出来。打个比方&#xff0c;对于2,5,10,17,26,37这样的数字序列&#xff0c;如何计算第7个值&#xff0c;肯定要先找该序列的规律&#xff0c;然后用n21这个表达式来描述其规律&#xff0c;进而得到第7个…

前端骨架屏应用

什么是骨架屏 骨架屏可以理解为在页面数据尚未返回或页面未完成完全渲染前&#xff0c;先给用户呈现一个由灰白块组成的当前页面大致结构&#xff0c;让用户产生页面正在逐渐渲染的感受&#xff0c;从而使加载过程从视觉上变得流畅。 生成后的骨架屏页面如下图所示&#xff1…

第二证券|沪指冲上3200点,中字头太火爆!

轿车整车概念股拉升&#xff0c;多要素共同刺激下&#xff0c;新能源车或将呈现一轮涨价潮。 今天早盘&#xff0c;三大股指走势分解&#xff0c;沪指拉升涨1.56%&#xff0c;站上3200点关口&#xff1b;创业板指则围绕平盘线展开震动&#xff0c;跌0.39%。 以稳妥股为首的大金…

将数据预处理嵌入AI模型的常见技巧

作者&#xff1a;战鹏州 英特尔物联网行业创新大使 目录 1.1 用模型优化器实现数据预处理 1.1.1 模型优化器预处理参数 1.1.2 将ResNet模型的预处理嵌入模型 1.2 用OpenVINO™ 预处理API实现数据预处理 1.3 使用模型缓存技术进一步缩短首次推理时延 1.4 总结 本文将介绍…

机器学习——评估和改进学习算法

0. 引言 当我们运用训练好了的模型来预测未知数据的时候发现有较大的误差&#xff0c;我们下一步可以做什么&#xff1f; 获得更多的训练样本——通常是有效的&#xff0c;但代价较大&#xff0c;下面的方法也可能有效&#xff0c;可考虑先采用下面的几种方法。尝试减少特征的…

2022年最新Android面试题整理,全网都在看,史上最全面试攻略

Android面试现在什么东西是必须考察的&#xff1f;专业素养还是面试技巧&#xff1f;四大组件还是Framework层源码&#xff1f;哪有什么必考的&#xff0c;可以说所有技术栈都不是必考&#xff0c;但又是必考。话虽看似矛盾&#xff0c;但却反映了当前国内互联网环境的现状&…