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

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() 方法。// 初始化方法1Person 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();// 初始化方法2Person.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转jsonStringString 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.mzph.cn/news/16287.shtml

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

相关文章

stable diffusion

一&#xff1a;安装。 stable diffusion 安装和使用全教程 - 知乎 Stable Diffusion安装 - 知乎 环境安装&#xff1a; 1&#xff1a;python 3.10安装。 Download Python | Python.org 切记要安装3.10版本&#xff0c;因为Stable diffusion是用3.10版本编写的&#xff0c;所…

【C++】 哈希

一、哈希的概念及其性质 1.哈希概念 在顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。比如顺序表需要从第一个元素依次向后进行查找&#xff0c;顺序查找时间复杂度为…

VS Code环境配置问题

VS Code 环境配置问题 文章目录 VS Code 环境配置问题配置 C问题解决不乱码只显示结果避免闪退&#xff0c;中文乱码 配置 Java下载 JDKJDK 环境配置安装插件 配置 C 跟着官网教程&#xff08;英文版&#xff09;和其他博客配置了一遍&#xff0c;却遇到了很多小问题&#xff…

MyBatis源码剖析之延迟加载源码细节

文章目录 什么是延迟加载&#xff1f;实现局部延迟加载全局延迟加载 延迟加载原理实现延迟加载原理&#xff08;源码剖析)Setting 配置加载&#xff1a;延迟加载代理对象创建注意事项 什么是延迟加载&#xff1f; 在开发过程中很多时候我们并不需要总是在加载⽤户信息时就⼀定…

Android 开发代码规范

一. AndroidStudio开发工具规范 使用最新的稳定版本.统一文件的编码格式为utf-8. 清除每个类里面的无效的import导包.代码样式统一,比如&#xff0c;tab缩进4个空格&#xff0c;或者 tab size等如果没有特殊情况使用默认的配置即可。每行字数每行字符数不得超过 160 字符&…

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块,文件权限修改

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12…

Mysql-MVCC 并发版本控制

参考链接&#xff1a;一文读懂MVCC实现原理_Nicolos_Z的博客-CSDN博客 1.总述&#xff1a; MVCC 主要是InnoDB解决数据库事务读写&#xff0c;导致的脏读、重复读问题的处理方法。通过快照读的方式&#xff0c;提高数据库并发查询的能力。 2.MVCC的实现 实现MVCC主要用到了…

在OK3588板卡上部署模型实现人工智能OCR应用

一、主机模型转换 我们依旧采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 安装rknn-toolkit2&#xff08;该工具不能在OK3588板卡上完成模型转换&#xff09; git clone https://github.com/rockchip-linux/rknn-to…

金蝶云星空任意文件读取漏洞复现(0day)

0x01 产品简介 金蝶云星空是一款云端企业资源管理&#xff08;ERP&#xff09;软件&#xff0c;为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织&#xff0c;多利润中心的大中型企业&#xff0c;以 “开放、标准、社交”三大特性为数字…

ChatGPT伦理挑战:人工智能的权利与责任

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

HCIP期中实验

考试需求 1 、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 OSPF 协议…

实时协作:团队效率倍增的关键

实时协作是指团队在当前时刻共同完成项目的能力。无论是否使用技术&#xff0c;都能实现这一点。然而&#xff0c;随着远程工作的盛行&#xff0c;安全的协作工具被用来让团队成员在项目和一般业务之间保持联系和同步。 传统协作与实时协作的区别 两种类型的协作最明显的区别…

uniapp 微信小程序 navigationBarBackgroundColor 标题栏颜色渐变

大体思路&#xff1a; 第一步&#xff1a;“navigationStyle”:“custom” 第二步&#xff1a; template内 重点&#xff1a;给view添加ref“top” 第三步&#xff1a;添加渐变色样式 1、pages.json {"path" : "pages/user/user","style" : …

【玩转Linux】Linux输入子系统简介

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

拯救者Y9000K无线Wi-Fi有时不稳定?该如何解决?

由于不同品牌路由器的性能差异&#xff0c;无法完美兼容最新的无线网卡技术&#xff0c;在连接网络时&#xff08;特别是网络负载较大的情况下&#xff09;&#xff0c;可能会出现Wi-Fi信号断开、无法网络无法访问、延迟突然变大的情况&#xff1b;可尝试下面方法进行调整。 1…

前端小练-仿掘金导航栏

文章目录 前言项目结构导航实现创作中心移动小球消息提示 完整代码 前言 闲的&#xff0c;你信嘛&#xff0c;还得开发一个基本的门户社区网站&#xff0c;来给到Hlang,不然我怕说工作量不够。那么这个的话&#xff0c;其实也很好办&#xff0c;主要是这个门户网站的UI写起来麻…

pytest study

pytest 测试用例的识别与运行 测试文件&#xff1a;test_*.py 和 *_test.py 以test开头或结尾的文件 测试用例&#xff1a;Test*类包含的所有 test_*的方法&#xff08;测试类不能带有__init__方法&#xff09;&#xff0c; 不在class中的所有test_*的方法 def func(x):r…

web-文件上传和upload-labs靶场通关

目录 前端过滤 uploads-lab-1: 后端验证 upload-labs-2&#xff1a;mime验证 upload-labs-3&#xff1a;黑名单绕过 upload-labs-4&#xff1a;黑名单绕过-.htaccess(这里得用旧版的phpstudy&#xff0c;新版的不行) upload-labs-5&#xff1a;后缀名绕过 upload-labs-…

Android Ble蓝牙App(一)扫描

Ble蓝牙App&#xff08;一&#xff09;扫描 前言正文一、基本配置二、扫描准备三、扫描页面① 增加UI布局② 点击监听③ 扫描处理④ 广播处理 四、权限处理五、扫描结果① 列表适配器② 扫描结果处理③ 接收结果 六、源码 前言 关于低功耗的蓝牙介绍我已经做过很多了&#xff0…

form-data 提交文件请求远程调用

文件请求方法 /*** 上传图文消息内的图片 获取url* 富文本内的图片** param file*/public static String uploadMediaGetUrl(File file) throws IOException {if (!file.exists()) {return null;}String responseData null;try {String url "http://localhost:8503/fil…