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


    一、什么是 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    然后在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);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    金仓数据库KingbaseES客户端编程接口指南-JDBC(5. JDBC 查询结果集处理)
    win11无法加载文件,因为在此系统上禁止运行脚本
    Flink被阿里收购4年,最开心的却是Spark背后的Databricks
    Java 多线程:基础
    带你快速掌握Linux最常用的命令(图文详解)- 最新版(面试笔试常考)
    Vue学习之--------全局事件总线(2022/8/22)
    [附源码]java毕业设计网上报销管理系统
    9.14|day 7| day 46| 139.单词拆分 |关于多重背包,你该了解这些!|背包问题总结篇!
    【C语言基础】Chap. 1. 初识C语言
    【已解决】Linux服务器安装JDK
  • 原文地址:https://blog.csdn.net/wjs040/article/details/128190469