Java读取及生成pb文件并转换jsonString

news2024/10/6 16:19:08

Java读取及生成pb文件并转换jsonString

  • 1. 效果图
  • 2. 原理
    • 2.1 Protocol Buffers是什么
    • 2.2 支持的语言
    • 2.3 根据.proto生成.java
    • 2.4 初始化及构建pb,读取,转jsonString
  • 3. 源码
    • 3.1 address.proto
    • 3.2 PbParseUtil.java
  • 参考

  1. 读取pb及生成pb文件
  2. pb文件转换jsonString
  3. 二进制pb转换jsonString
  4. 赋值(有空或者类型不对应会无法赋值及报错)

1. 效果图

在这里插入图片描述

2. 原理

2.1 Protocol Buffers是什么

协议缓冲区是用于序列化结构化数据的与语言无关、与平台无关的可扩展机制。

协议缓冲区(Protocol Buffers又名protobuf)是 Google 的语言中立、平台中立、可扩展的 序列化结构化数据的机制 – 想想 XML,但更小、更快、 简单。只需定义一次数据的结构,然后就可以 使用特殊生成的源代码轻松编写和读取结构化数据,往返各种数据流并使用多种语言。

2.2 支持的语言

协议缓冲区目前支持Java,Python,Objective-C,中生成的代码 和C++。使用新的 proto3 语言版本,还可以使用 Kotlin, Dart,Go,Ruby,PHP和C#,还有更多的语言即将推出。

2.3 根据.proto生成.java

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

2.4 初始化及构建pb,读取,转jsonString

标准消息方法:

  • isInitialized():检查是否已设置所有必填字段。
  • toString():返回消息的人类可读表示形式, 对于调试特别有用。
  • mergeFrom(Message other):(仅限构建器)合并 的内容 other 到此消息中,覆盖奇异标量字段,合并复合 字段,并连接重复字段。
  • clear():(仅限构建器)将所有字段清除回空状态。

解析和序列化:

  • byte[] toByteArray();:序列化消息并返回一个字节数组 包含其原始字节。
  • static Person parseFrom(byte[] data);:解析来自给定的消息 字节数组。
  • void writeTo(OutputStream output);:序列化消息并写入它 到一个 OutputStream.
  • static Person parseFrom(InputStream input);:读取和分析消息 从 InputStream.

3. 源码

3.1 address.proto

syntax = "proto3";

package tutorial;

option java_multiple_files = true;
option java_package = "com.example.tutorial.protos";
option java_outer_classname = "AddressBookProtos";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
  Geometry geometry=4;
  repeated PhoneNumber phones = 5;

  enum PhoneType {
    PHONE_TYPE_UNSPECIFIED = 0;
    PHONE_TYPE_MOBILE = 1;
    PHONE_TYPE_HOME = 2;
    PHONE_TYPE_WORK = 3;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  message Geometry {
    repeated Point point=1;
  }

  message Point{
    double longitude = 1;
    double latitude = 2;
    double altitude = 3;
  }

}

message AddressBook {
  repeated Person people = 1;
}

3.2 PbParseUtil.java

package com.test.utils;

import com.example.tutorial.protos.AddressBook;
import com.example.tutorial.protos.Person;
import com.googlecode.protobuf.format.JsonFormat;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*************************************
 *Class Name: PbParseUtil
 *Description: <pb读取转换工具类>
 *@author: Seminar
 *@create: 2023/7/31
 *@since 1.0.0
 *************************************/
public class PbParseUtil {

    // 打印pb的所有字段
    static void Print(AddressBook addressBook) {
        for (Person person : addressBook.getPeopleList()) {
            System.out.println("Person ID: " + person.getId());
            System.out.println("  Name: " + person.getName());
            if (StringUtils.isNotEmpty(person.getEmail())) {
                System.out.println("  E-mail address: " + person.getEmail());
            }

            for (Person.PhoneNumber phoneNumber : person.getPhonesList()) {
                switch (phoneNumber.getType()) {
                    case PHONE_TYPE_MOBILE:
                        System.out.print("  Mobile phone #: ");
                        break;
                    case PHONE_TYPE_HOME:
                        System.out.print("  Home phone #: ");
                        break;
                    case PHONE_TYPE_WORK:
                        System.out.print("  Work phone #: ");
                        break;
                }
                System.out.println(phoneNumber.getNumber());
            }

            if (person.getGeometry() != null) {
                for (Person.Point point : person.getGeometry().getPointList()) {
                    System.out.println("lon: " + point.getLongitude() + ",lat: " + point.getLatitude() + ",alt: " + point.getAltitude());
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {

        // 协议缓冲区编译器生成的消息类都是 不可变 。消息对象一旦构造完成,就无法修改,
        // 要构造消息,必须首先构造一个 生成器,将要设置的任何字段设置为所选值,然后调用build() 方法。

        // 初始化方法1
        Person john = Person.newBuilder()
                .setId(1234)
                .setName("John Doe")
                .setEmail("jdoe@example.com")
                .addPhones(
                        Person.PhoneNumber.newBuilder()
                                .setNumber("555-4321")
                                .setType(Person.PhoneType.PHONE_TYPE_HOME))
                .build();

        // 初始化方法2
        Person.Builder person = Person.newBuilder();
        person.setEmail("1222@qq.com");
        person.setName("Lucy");
        person.setId(1).addPhones(Person.PhoneNumber.newBuilder()
                .setNumber("12634524230")
                .setType(Person.PhoneType.PHONE_TYPE_MOBILE));


        // java pb转二进制
        byte[] personPb = john.toByteArray();

        // java pb转pb文件
        byte[] personPb2 = person.build().toByteArray();
        String pbFilePath = System.getProperty("user.dir") + File.separator + "person.pb";
        try (FileOutputStream fileWriter = new FileOutputStream(pbFilePath)) {
            fileWriter.write(personPb2);
        }

        // pb二进制转Java对象
        // pb文件转Java对象
        Person person1 = Person.parseFrom(personPb);
        Person person2 = Person.parseFrom(new FileInputStream(pbFilePath));

        // pb文件转Java对象
        Person.Builder person3 = Person.newBuilder();
        person3.mergeFrom(new FileInputStream(pbFilePath));
        // 某些字段没有的,需要单独设置
        Person.Geometry.Builder geometryBuilder = Person.Geometry.newBuilder();
        for (int i = 0; i < 3; i++) {
            geometryBuilder.addPoint(Person.Point.newBuilder().setLongitude(113.222222 + i * 1.5).setLatitude(40.1 + i * 0.89).setAltitude(40 + i * 0.45).build());
        }
        person3.setGeometry(geometryBuilder.build());

        System.out.println("person1 name: " + person1.getName());
        System.out.println("person2 name: " + person2.getName());
        System.out.println("person3 name: " + person2.getName());

        AddressBook address = AddressBook.newBuilder()
                .addPeople(person1).addPeople(person3).build();
        Print(address);

        // pb转jsonString
        String str = JsonFormat.printToString(address);
        System.out.println("jsonStr: " + str);
    }
}

参考

  • http://code.google.com/p/protobuf/
  • Java proto 如何生成和反序列化消息
  • pb文件读取:https://blog.csdn.net/feiying0canglang/article/details/126125854
  • pb文件转java对象:https://protobuf.dev/getting-started/javatutorial/

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

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

相关文章

vue-cli4升级到vue-cli5的踩坑记录

前言 最近对部分项目升级了vue-cli脚手架&#xff0c;记录一下 问题一&#xff1a; scss/less/css中无法引入public下的静态资源 问题描述 在样式文件中使用静态资源路径导致编译无法通过 错误信息如下&#xff1a; Module not found: Error: Cant resolve /img/login/lo…

框架的知识点整理

目录 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; 2 、 使用Spring框架有什么好处&#xff1f; 3、Spring MVC 工作原理 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; Spring框架是一个开源的轻量级的Java应用程序开…

MySQL主从复制及读写分离(三十四)

目录 MySQL主从复制 一、概述 1、MySQL Replication优点&#xff1a; 二、MySQL复制类型 1、异步复制&#xff08;Asynchronous repication&#xff09; 2、全同步复制&#xff08;Fully synchronous replication&#xff09; 3、半同步复制&#xff08;Semisynchronous…

【构造】CF1758 C

Problem - 1758C - Codeforces 题意&#xff1a; 思路&#xff1a; 思路&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e510; const int mxe2e510;int N,x; int ans[mxn];void solve(){cin>>N>>x;if(N%x!0)…

1999-2021年30省平均受教育年限(含原始数据和具体计算过程)

1999-2021年30省平均受教育年限&#xff08;含原始数据和具体计算过程&#xff09; 1、时间&#xff1a;1999-2021年 2、范围&#xff1a;30省&#xff08;剔除西藏&#xff09; 3、计算方式&#xff1a;平均受教育年限&#xff08;未上学人数*0小学人数*6初中人数*9高中人数…

2023年7月第4周大模型荟萃

2023年7月第4周大模型荟萃 2023.7.31版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、Cerebras推出全球最强AI超算 AI芯片初创公司Cerebras Systems和总部位于阿联酋的技术控股集团G42于7月20日宣布&#xff0c;携手打造一个由互联的超…

pytorch学习——正则化技术——权重衰减

一、概念介绍 权重衰减&#xff08;Weight Decay&#xff09;是一种常用的正则化技术&#xff0c;它通过在损失函数中添加一个惩罚项来限制模型的复杂度&#xff0c;从而防止过拟合。 在训练参数化机器学习模型时&#xff0c; 权重衰减&#xff08;weight decay&#xff09;是…

【JavaEE初阶】Servlet(四) Cookie Session

文章目录 1. Cookie && Session1.1 Cookie && Session1.2 Servlet会话管理操作 1. Cookie && Session 1.1 Cookie && Session Cookie是什么? Cookie是浏览器提供的持久化存储数据的机制.Cookie从哪里来? Cookie从服务器返回给浏览器. 服务…

生产中出现CPU或者内存飙升如何进行解决

文章目录 定位CPU标高内存问题JVM参数工具 定位CPU标高 方法1&#xff1a; 1-启动&#xff1a;java -jar 2_cpu-0.0.1-SNAPSHOT.jar 8 > log.file 2>&1 & 2-一般来说&#xff0c;应用服务器通常只部署了java应用&#xff0c;可以top一下先确认&#xff0c;是否是…

Java 错误异常介绍(Exceptions)

1、异常介绍 异常是程序执行期间发生的意外事件。它影响程序指令流&#xff0c;从而导致程序异常终止。 发生异常的原因有很多。其中包括&#xff1a; 无效的用户输入 设备故障 网络连接丢失 物理限制&#xff08;磁盘内存不足&#xff09; 代码错误 打开一个不可用的文…

第四章:C语言的条件分支控制结构

文章目录 1、分支控制if..else...2、分支控制if..else if...else...(嵌套)3、Switch4、goto 1、分支控制if…else… 标准格式&#xff1a;if{}else{} {}里面的语句表示条件是否成立再决定是否执行 2、分支控制if…else if…else…(嵌套) 标准格式&#xff1a;if{}else if{}…

无人机调试笔记——常见参数

无人机的PID调试以及速度相关参数 1、Multicopter Position Control主要是用来设置无人机的各种速度和位置参数。调试顺序是先调试内环PID&#xff0c;也就是无人机的速度闭环控制&#xff0c;确认没有问题后再进行外环位置控制&#xff0c;也就是定点模式控制。 2、调试的时…

CentOS7.3 安装 docker

亲测、截图 阿里云服务器 文章目录 更新源2345 启动开机自启 更新源 sudo yum update -y2 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 sudo yum …

一款介于无代码和低代码之间的数据可视化平台

一、前言 随着企业数字化拉开序幕&#xff0c;低代码( Low Code Development)开发的概念开始火起来&#xff0c;即用少量的代码就能开发复杂的业务系统。然后更进一步&#xff0c;由此又催生出一个新的概念&#xff1a;无代码开发( No Code Development)。 低代码和无代码开发平…

【C++从0到王者】第十四站:list基本使用及其介绍

文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示&#xff0c;是库里面对list的基本…

自然语言处理学习笔记(一)————概论

目录 1.自然语言处理概念 2.自然语言与编程语言的比较 &#xff08;1&#xff09;词汇量&#xff1a; &#xff08;2&#xff09;结构化&#xff1a; &#xff08;3&#xff09;歧义性&#xff1a; &#xff08;4&#xff09;容错性&#xff1a; &#xff08;5&#xff0…

【143. 重排链表】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不…

Redis (一)消息订阅和发送测试

〇、redis 配置 1、概况 本文基于 Ubuntu20.04 云服务器配置Redis&#xff0c;且在本地进行 Redis 测试。 2、目录概况 一、配置文件 位于 /config/app.yml 中&#xff0c;目的用于 Redis 初始化&#xff1a; redis:addr: "39.104.**.28:6379"password: "p…

盛元广通实验室教学仪器设备综合信息管理系统LIMS

实验室作为学生以及教师进行科研教学环境&#xff0c;对于实验室设备的使用情况、维护、借还、台账管理、盘点、报废等需要得到有效的管理&#xff0c;以促进科研教学工作的高质量开展&#xff0c;介于传统手动管理方式越发不能满足现代科研的飞速发展需要&#xff0c;实验室的…

【element-plus】 table表格每行圆角解决方案 element也通用

系列文章目录 【Vue3ViteTselement-plus】使用tsx实现左侧栏菜单无限层级封装 前言 我们在使用element-plus或element 的table时是否有时UI给到的UI效果是如下面这样的&#xff0c;但是我们翻遍了组件库的文档 调整了很多次样式 发现在 左右侧栏固定的时候 普通的方法是完全…