Protobuf:一种轻量级、高效的数据交换格式,附Java与Python数据交换示例

news2024/11/19 17:28:27

目录

    • 下载安装Protobuf
    • 定义数据格式
    • Java代码序列化
    • Python反序列化

Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的数据交换格式

  • 官方文档:https://protobuf.dev/overview/
  • GitHub:https://github.com/protocolbuffers/protobuf
  • https://github.com/protocolbuffers/protobuf/releases/latest
  • VSCode语法高亮插件:vscode-proto

本文仅做一个简单的代码演示,并不涉及原理说明

本文演示如何将Java数据通过文件的方式传递给Python
在这里插入图片描述

项目结构

protobuf-demo/
  protobuf-data        # 定义通用的数据结构
  protobuf-java        # Java项目序列化protobuf
  protobuf-python      # Python项目反序列化protobuf

下载安装Protobuf

# 检查系统版本
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.4
BuildVersion:   18E2035

# 下载解压 protoc-23.0-osx-x86_64.zip

$ ./bin/protoc --version
libprotoc 23.0

定义数据格式

protobuf-data/addressbook.proto

// 文件:addressbook.proto

// 指定 Protobuf 版本为版本3
syntax = "proto3";
// 指定 protobuf 包名,防止有相同类名的 message 定义
package com.example.protobuf;
// 是否生成多个文件
option java_multiple_files = true;
// 生成的文件存放在哪个包下
option java_package = "com.example.protobuf";
// 生成的类名,如果没有指定,会根据文件名自动转驼峰来命名
option java_outer_classname = "AddressBookProtos";

message Person {
  // =1,=2 作为序列化后的二进制编码中的字段的唯一标签,也因此,1-15 比 16 会少一个字节,所以尽量使用 1-15 来指定常用字段。
  optional int32 id = 1;
  optional string name = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

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

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

使用 Protobuf 提供的编译器,可以将 .proto 文件编译成各种语言的代码文件(如 Java、C++、Python 等)。
在这里插入图片描述

Java代码序列化

依赖

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.22.3</version>
</dependency>

生成java代码

./bin/protoc --java_out=../protobuf-java/src/main/java ./addressbook.proto

项目结构

$ tree
.
├── pom.xml
├── protobuf-java.iml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── example
    │               └── protos
    │                   ├── AddressBook.java
    │                   ├── AddressBookOrBuilder.java
    │                   ├── AddressBookProtos.java
    │                   ├── Person.java
    │                   └── PersonOrBuilder.java
    └── test
        └── java
            └── com
                └── example

构建测试

package com.example;

import com.example.protos.AddressBook;
import com.example.protos.Person;
import org.junit.Test;

public class ProtobufTest {
    @Test
    public void testBuildProtobuf(){
        //  构建
        AddressBook addressBook = AddressBook
                .newBuilder()
                .addPeople(Person.newBuilder()
                        .setId(2)
                        .setName("小明")
                        .setEmail("yyds@126.com")
                        .addPhones(Person.PhoneNumber.newBuilder()
                                .setNumber("18388888888")
                                .setType(Person.PhoneType.HOME)
                        )
                )
                .build();
        System.out.println(addressBook);
    }
}

输出

people {
  id: 2
  name: "\345\260\217\346\230\216"
  email: "yyds@126.com"
  phones {
    number: "18388888888"
    type: HOME
  }
}

序列化

// 序列化成字节数组
byte[] byteArray = addressBook.toByteArray();
// 反序列化 - 字节数组转对象
AddressBook addressBook2 = AddressBook.parseFrom(byteArray);
System.out.println("字节数组反序列化:");
System.out.println(addressBook2);
// 序列化到文件
addressBook.writeTo(new FileOutputStream("AddressBook.txt"));
// 读取文件反序列化
AddressBook addressBook3 = AddressBook.parseFrom(new FileInputStream("AddressBook.txt"));
System.out.println("文件读取反序列化:");
System.out.println(addressBook3);

AddressBook.txt


)小明yyds@126.com"
18388888888

Python反序列化

安装依赖

pip install protobuf

生成Python代码

./bin/protoc --python_out=../protobuf-python ./addressbook.proto

目录

$ tree -I venv
.
├── AddressBook.txt            # 由上一步java代码输出的数据文件
├── addressbook_pb2.py         # 自动生成的文件
└── demo.py

反序列化示例 demo.py

# -*- coding: utf-8 -*-
"""
@File    : demo.py
@Date    : 2023-05-12
"""
import addressbook_pb2

if __name__ == '__main__':
    # 反序列化
    with open('AddressBook.txt', 'rb') as f:
        addressBook = addressbook_pb2.AddressBook()
        addressBook.ParseFromString(f.read())


        for person in addressBook.people:
            print(person.name)
            # 小明

直接打印addressBook对象

people {
  id: 2
  name: "\345\260\217\346\230\216"
  email: "yyds@126.com"
  phones {
    number: "18388888888"
    type: HOME
  }
}

Python的体验不是很好,代码提示的能力基本为零,需要使用dir(obj)查看对象属性才知道

完整代码:https://github.com/mouday/protobuf-demo

参考
Protobuf: 高效数据传输的秘密武器
Python使用protobuf序列化和反序列化

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

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

相关文章

佩戴舒适的蓝牙耳机有哪些?蓝牙耳机佩戴舒适度排名

随着技术的成熟&#xff0c;真无线耳机这个市场竞争也越来越激烈&#xff0c;伴随着TWS真无线耳机快速发展&#xff0c;许多耳机品牌凭借着优质的产品抓住了时代机遇&#xff0c;各家无论是手机厂商还是耳机品牌争相布局真无线耳机市场&#xff0c; 下面笔者整理了几款佩戴舒适…

Towards Open World Object Detection(OWOD)代码复现

参考上一篇博客detectron2-入门安装,然后进行以下操作&#xff1a; 1、首先在OWOD文件目录运行以下代码&#xff0c;完成内部构建 python -m pip install -e ./ 2、数据集准备 首先下载数据集Annotations和JPEGImages:下载链接&#xff0c;需要翻墙&#xff0c;下载方法可以…

苹果手机连接电脑没反应怎么办?都进来看一下!

案例&#xff1a;iPhone连接电脑没反应 【盆友们&#xff0c;想要上传照片到电脑上&#xff0c;但是苹果手机连接电脑没反应是咋回事&#xff1f;】 手机连接电脑没反应会影响到您与电脑之间的数据传输和文件管理。本文将为您介绍解决苹果手机连接电脑没反应问题的方法&#x…

RethinkDB成为Linux基金会的一员

导读日前&#xff0c;RethinkDB项目有了新的动态。Cloud Native Computing基金会&#xff08;CNCF&#xff09;宣布它购买了NoSQL分布式文件存储数据库RethinkDB的源代码版权&#xff0c;将授权协议从Affero GPLv3改为Apache v2&#xff0c;并将其捐赠给Linux基金会。 2016年1…

多媒体基础

第九章、多媒体基础 1、多媒体技术基本概念 1.1、音频相关概念 超声波的频率通常在20千赫兹以上&#xff0c;无法被人类的耳朵听到&#xff0c;常用于医疗诊断、非破坏性材料测试、清洗、测量等领域 次声波的频率通常在20赫兹以下&#xff0c;同样无法被人类的耳朵听到&…

失败 深度linux社区版 20.8 编译安装 nvidia-docker,启动Stable Deffision WebUI docker 容器

环境 说明&#xff1a; 深度apt 源中无法直接安装nvidia-docker 下载源码 github地址&#xff1a; GitHub - NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs 下载最新release https://github.com/NVIDIA/nvidia-docker/archive/refs/tags/…

普通人如何抓住AI这个风口?

​ 要抓住AI这个风口&#xff0c;普通人可以从以下几个方面入手&#xff1a; 1. 学习AI相关知识&#xff1a;可以通过自学、参加培训班、参加线上课程等方式学习AI相关知识&#xff0c;掌握AI的基本原理和应用场景。 2. 参与AI开源社区&#xff1a;可以加入AI开源社区&#…

CVPR 2023 | 目标跟踪新框架:用自回归序列生成的方式训练模型读出目标

如果模型知道目标在哪&#xff0c;那么我们只需要教模型读出目标的位置&#xff0c;而不需要显式地进行分类、回归。对于这项工作&#xff0c;研究者们希望可以启发人们探索目标跟踪等视频任务的自回归式序列生成建模。 自回归式的序列生成模型在诸多自然语言处理任务中一直占…

【Midjourney】Midjourney 的 Prompt 指令类型 ( 画风指令 | 人物细节指令 | 灯光镜头指令 | 艺术家风格指令 )

文章目录 一、Midjourney 的 Prompt 详细指令规则二、Midjourney 的画风指令关键词1、超现实主义2、注重细节描写3、Artstation 画风4、数字绘画风格5、漫画风格6、线条艺术 三、Midjourney 的人物细节描写关键词1、面部特征描写2、身体描写3、生成示例 14、生成示例 2 四、Mid…

实在智能与浙江工商大学官宣战略合作,共建人工智能联合实验室和实习基地

5月10日&#xff0c;实在智能与浙江工商大学正式官宣战略合作&#xff0c;并进行“人工智能联合实验室” “大学生实习实践基地”揭牌仪式。躬身入局共筑人工智能人才生态&#xff0c;这是实在智能和浙江工商大学的共同愿景&#xff0c;也是校企双方深度产学研融合、加速科技型…

从10进制到1000进制:一场数字的盛宴

本篇博客会讲解力扣“1920. 基于排列构建数组”的解题思路&#xff0c;这是题目链接。 先来审下题&#xff1a; 以下是输出示例&#xff1a; 以下是提示&#xff1a; 相信读完题的你已经感到没啥意思了&#xff0c;感觉做这道题就是在浪费时间。但是还是建议你看下去&…

git保姆级教程(概述、理论、指令、创建及代码初始化完整步骤、分支与冲突、遇到的问题)

目录 版本控制安装配置理论部分项目创建及克隆创建全新仓库克隆远程仓库 文件操作理论实操 使用码云分支与冲突实操说明 遇到的问题vscode配置问题vscode克隆慢的问题 后记 版本控制 概述&#xff1a; 版本迭代&#xff0c;更新速度快&#xff0c;于是需要版本管理器。 作用&…

Python大厂经典面试题附答案,提前做好准备

对于大部分Python学习者来说&#xff0c;基础核心知识基本已经掌握了&#xff0c;但"纸上得来终觉浅,绝知此事要躬行"&#xff0c;要想完全掌握Python&#xff0c;还得靠实践应用。 比如面试的时候&#xff0c;面试官会出其不意的问一些问题&#xff0c;今天给大家分…

浅谈月出月落和月相的计算方法以及替代工具 - 月出月落和月相 API

引言 如果你想知道精确的月出月落时间&#xff0c;又或者你想设计一个月出月落时间查询的应用&#xff0c;又或者你只是好奇点进来了&#xff0c;还是可以过来围观一下涨涨知识&#xff0c;今天想跟大家聊一聊的是月出月落的计算方法以及替代工具 - 月出月落和月相 API 。 月…

污水除磷主要方法,磷酸盐的深度去除,正磷、次磷、亚磷树脂吸附

化学沉淀法除磷工艺虽除磷效率相对较好&#xff0c;但消耗化学药剂并产生大量的化学污泥&#xff0c;处理成本相对昂贵&#xff1b;而传统的生物处理工艺操作简单&#xff0c;但磷去除效率较低&#xff0c;难以满足出水要求。 Tulsimer A-107 是一款专门开发的&#xff0c;基于…

win10中rclone挂载minio的多实例安装方式

1.下载rclone安装包&#xff0c;复制多个.exe并重命名 2.1添加rclone1server.xml <service><id>rclone1</id><name>rclone1</name><description>rclone1service</description><executable>rclone</executable><argum…

有没有中国版的chatGPT?

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以通过自然语言处理技术与用户进行交互和对话。ChatGPT的目的是为用户提供便捷的问答服务和娱乐&#xff0c;它可以回答各种问题&#xff0c;例如天气、新闻、历史、文化、科技、娱乐等等。ChatGPT的核心技术是基于GPT模…

AOP的工作流程和核心概念及代理对象

1. 工作流程及核心概念 Spring容器启动读取所有切面配置中的切入点&#xff0c;未配置的切入点不进行读取 初始化bean&#xff0c;判断bean对应的类中的方法是否匹配到任意切入点 匹配成功&#xff1a;在Spring框架中&#xff0c;Bean初始化时会通过扫描程序中的带有特定注解的…

【学习笔记】低速数字输入电路

1、方案设计&#xff1a;单通道、单向、反相器 该电路采用单通道&#xff0c;单向光耦&#xff0c;只支持漏型输入&#xff0c;电路的输入端压差满足24V DC10%(21.6V DC-26.4V DC)&#xff0c;输出端电压在0~3.3V范围摆动。 1.1关键技术规格 1.2具体原理图 1.3电路原理详解 …

直接使用ChatGPT的方法

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的意图和回答用户的问题。 ChatGPT可以回答各种问题&#xff0c;包括但不限于常见问…