protobuf 使用和介绍

简介: protobuf 使用和介绍

介绍

Protobuf 有没有比 JSON 快 5 倍?-InfoQ

(3条消息) protobuf、thrift、avro对比

序列化:ProtoBuf与JSON的比较

Protobuf 使用介绍及原理: Protobuf 使用介绍及原理 (gitee.com)

(2条消息) Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?_Carson带你学Android

使用

Intellij IDEA中使用Protobuf的正确姿势

syntax="proto3";
option java_package = "com.vince.xq";
option java_multiple_files=true;
option java_outer_classname="AddressBookProtos";
message Student {
  int32 id = 1;
  string name = 2;
  string email = 3;
}

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>test-maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <grpc.version>1.6.1</grpc.version>
        <protobuf.version>3.3.0</protobuf.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.4.0</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>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>${protobuf.version}</version>
        </dependency>
    </dependencies>
    <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.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>
</project>

点击compile

将在target 中生成的java 文件拷贝到 com.vince.xq 下   -----删除不需要拷贝

Generated Resources Root

package com.vince.xq;
public class StudentVo {
    private int id;
    private String name;
    private String email;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}
package com.vince.xq;
import com.alibaba.fastjson.JSONObject;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import java.util.List;
public class MavenTest {
    public static void main(String[] args) {
        //获取Student对象
        //这里的Student对象构造器被私有化,我们通过Student的内部类Builder来构建builder
        Student.Builder builder= Student.newBuilder();
        //通过Student的内部类builder提供了构建Student相关属性的set方法
        builder.setId(1);
        builder.setName("凌晨0点0分");
        builder.setEmail("31346337@qq.com");
        //序列化
        Student stu=builder.build();
        System.out.println("protobuf数据大小: " + stu.toByteString().size());
        //再将封装有数据的对象实例,转换为字节数组,用于数据传输、存储等
        byte[] stuByte = stu.toByteArray();
        //这里得到了stuBte字节数组后,我们可以将该数据进行数据传输或存储,这里至于用什么技术传输就根据具体情况而定
        //假如这里stuByt通过传输,下面的代码接到了该数据
        //接收方 ,这里为了方便我们就写在一个类里面
        //将字节数据反序列化为对应的对象实例
        Student student=null;
        try {
            student= Student.parseFrom(stuByte);
            //这里得到了Student实例了,就可以根据需要来操作里面的数据了
            System.out.println("学生ID:"+student.getId());
            System.out.println("姓名:"+student.getName());
            System.out.println("email:"+student.getEmail());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        /*如何快速的进行json格式化*/
        StudentVo studentVo=new StudentVo();
        studentVo.setId(1);
        studentVo.setName("凌晨0点0分");
        studentVo.setEmail("31346337@qq.com");
        //System.out.println("protobuf数据大小: " + studentVo.size());
        String jsonObject="";
        try {
            jsonObject= JSONObject.toJSONString(studentVo);
        } catch (Exception e) {
            System.out.println(1111);
        }
        System.out.println(jsonObject.toString());
        System.out.println("json数据大小: "+jsonObject.getBytes().length);
    }
}


相关文章
|
机器学习/深度学习 自然语言处理 数据处理
大模型开发:描述长短期记忆网络(LSTM)和它们在序列数据上的应用。
LSTM,一种RNN变体,设计用于解决RNN处理长期依赖的难题。其核心在于门控机制(输入、遗忘、输出门)和长期记忆单元(细胞状态),能有效捕捉序列数据的长期依赖,广泛应用于语言模型、机器翻译等领域。然而,LSTM也存在计算复杂度高、解释性差和数据依赖性强等问题,需要通过优化和增强策略来改进。
554 1
|
域名解析 网络协议 安全
DNS&BIND9安装配置
DNS概念,BIND9的详细配置安装
2201 2
|
存储 SQL 缓存
记录一次holo视图与物化视图的区别
本文介绍了Hologres中视图与物化视图的区别及应用场景。视图是一种虚拟表,不存储数据,查询时动态生成结果集,适用于简化查询、数据抽象等场景。物化视图则预先计算并存储查询结果,查询速度快,适合加速查询、离线数据分析等场景。文章通过实例详细说明了两者的使用方式及性能考量,并探讨了如何根据具体需求选择合适的视图类型。
409 16
|
Linux Python
Linux 安装python3.7.6
本教程介绍在Linux系统上安装Python 3.7.6的步骤。首先使用`yum`安装依赖环境,包括zlib、openssl等开发库。接着通过`wget`下载Python 3.7.6源码包并解压。创建目标文件夹`/usr/local/python3`后,进入解压目录执行配置、编译和安装命令。最后设置软链接,使`python3`和`pip3`命令生效。
|
XML Java 数据格式
【Spring容器的启动流程】
【Spring容器的启动流程】
776 0
|
JavaScript 前端开发 网络协议
JS RPC详解
JS RPC详解
477 2
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
568 2
|
消息中间件 存储 编解码
带你读《云原生架构白皮书2022新版》——网易云音乐曲库研发负责人谈音视频算法的 Serverless 探索之路
带你读《云原生架构白皮书2022新版》——网易云音乐曲库研发负责人谈音视频算法的 Serverless 探索之路
972 100
|
SQL 监控 关系型数据库
使用SQL语句查询操作耗时的技巧与方法
在数据库管理和优化过程中,了解SQL查询操作的耗时是至关重要的
1887 0
|
存储 缓存 NoSQL
Redis内存管理揭秘:掌握淘汰策略,让你的数据库在高并发下也能游刃有余,守护业务稳定运行!
【8月更文挑战第22天】Redis的内存淘汰策略管理内存使用,防止溢出。主要包括:noeviction(拒绝新写入)、LRU/LFU(淘汰最少使用/最不常用数据)、RANDOM(随机淘汰)及TTL(淘汰接近过期数据)。策略选择需依据应用场景、数据特性和性能需求。可通过Redis命令行工具或配置文件进行设置。
334 2

热门文章

最新文章