Protobuf 了解一下

Protobuf 介绍与实战10:如何定义包名java_package、go_package(如, 定义Java、go里的包名) 目前,只测试了Java,go语言。 其他语言,由于本身不了解,没有做过多的测试,以后如果有相关内容,会继续追加在本文章的。 1、Java语言 如何生成包名 针对Java语言,如果想生成类的包名的话,大概有两种方式: package 包名 option java_package=包名 1.1、package方式 情况一: 情况二: 1.2、option java_package 方式 2、GO语言 如何生成包名 针对go语言,如果想生成类的包名的话,大概有两种方式: package 包名 opt 阅读详情

ProtoBuf 使用

ProtoBuf 全称 protocol buffers,是 google 开源的一个平台无关、语言无关的序列化框架。
官网点击这里 protobuf 官网


文本通过一个简单的案例介绍 protobuf 的简单使用。

创建 addressbook.proto 文件

创建一个 maven 项目,在 resources 下创建一个目录 proto (可自己更改),然后在该目录下创建一个 addressbook.proto 文件。

syntax = "proto3";

package tutorial;

option java_package = "protobuf.demo.tutorial";
option java_outer_classname = "AddressBookProto";

message Person{
  int32 id = 1;
  string name = 2;
  string email = 3 ;

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

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

  repeated PhoneNumber phones = 4;
}

message AddressBook{
  string bookName = 1;
  repeated Person people = 2;
}

syntax 定义 .proto 文件使用的是 proto3 的语法。proto2 和 proto3 的语法区别可以去官网查看。
package 指的是该 .proto 文件里定义的类的包路径。
option java_package指的最终生成的 java 类所在的包名。
option java_outer_classname指的是最终生成的 java 类的名称。
message指的定义的消息类。
enum 定义枚举类。
repeated 指明该字段可以重复添加,在 java 看来该字段是一个 list 集合。

生成 java 类

生成 java 类的方式有很多种,这里用列举两种方式。

maven 插件

编写 maven pom 文件,新增如下内容。

<dependencies>
  <dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-all</artifactId>
    <version>1.30.1</version>
  </dependency>
</dependencies>
<build>
  <!--这个是为了下载下面的工具用的,他可以提供一些变量,os.detected.classifier变量可以根据当前系统的类型来下载对应的工具-->
  <extensions>
    <extension>
      <groupId>kr.motd.maven</groupId>
      <artifactId>os-maven-plugin</artifactId>
      <version>1.6.2</version>
    </extension>
  </extensions>
  <plugins>
    <plugin>
      <groupId>org.xolstice.maven.plugins</groupId>
      <artifactId>protobuf-maven-plugin</artifactId>
      <version>0.5.0</version>
      <!--添加.proto文件的编译工具-->
      <configuration>
        <!--protoc工具通过.proto文件生成对应的java对应的类-->
        <protocArtifact>com.google.protobuf:protoc:3.0.0-beta-4:exe:${os.detected.classifier}
        </protocArtifact>
        <!--protoc-gen-grpc-java工具通过.proto文件生成grpc工具类-->
        <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.15.0:exe:${os.detected.classifier}</pluginArtifact>
        <!--这是生成grpc工具类存放的文件夹的名字-->
        <pluginId>grpc</pluginId>
        <!--要编译的.proto文件的路径-->
        <protoSourceRoot>src/main/resources/proto</protoSourceRoot>
      </configuration>
      <executions>
        <!--这是上面两个编译工具用到的命令-->
        <execution>
          <goals>
            <goal>compile</goal>
            <goal>compile-custom</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

引入依赖之后,运行 maven 插件。
在这里插入图片描述
运行结束之后在 target 目录下可以看到生成的 java 文件。
在这里插入图片描述

编译工具

去官网下载最新的编译工具,传送门点这里。根据自己的操作系统下载。然后运行如下命令:

protoc -I=./src/main/resources/proto/ --java_out=./src/main/java ./src/main/resources/proto/addressbook.proto 

-I 指.proto 文件所在目录,**–java_out **指生成的 java 文件所在的目录,后面紧跟.proto 文件。这样生成的文件如下图:
在这里插入图片描述

编写测试代码

main 方法如下:

public static void main(String[] args) throws IOException {
    File file = new File("address_book.txt");
    if (!file.exists() && file.createNewFile()) {
        System.out.println("创建了一个新的通讯录" + file.getName());
    }
    System.out.println("开始新增人员信息");
    writeAddressBook(file);
    System.out.println("--------------");
    System.out.println("开始读取人员信息");
    readAddressBook(file);
    System.out.println("--------------");
}

生成一个文件,然后写入一个人员信息,再从文件中读取出来。

private static void writeAddressBook(File file) throws IOException {
    FileOutputStream outputStream = new FileOutputStream(file);
    // 创建一个手机号码
    AddressBookProto.Person.PhoneNumber.Builder builder = AddressBookProto.Person.PhoneNumber.newBuilder();
    AddressBookProto.Person.PhoneNumber phoneNumber1 = builder
        .setNumber("17500001111")
        .setType(AddressBookProto.Person.PhoneType.MOBILE)
        .build();
    builder.clear();
    AddressBookProto.Person.PhoneNumber phoneNumber2 = builder
        .setNumber("18900002222")
        .setType(AddressBookProto.Person.PhoneType.WORK)
        .build();
    // 创建一个人 韩信
    AddressBookProto.Person hanXin = AddressBookProto.Person.newBuilder()
        .setId(1)
        .setName("韩信")
        .setEmail("hanxin@proto.com")
        .addPhones(phoneNumber1)
        .addPhones(phoneNumber2)
        .build();
    System.out.println("新增通讯录人员信息成功");
    // 将 七七这个人的信息添加到通讯录
    AddressBookProto.AddressBook addressBook = AddressBookProto.AddressBook.newBuilder()
        .setBookName("七七的通讯录")
        .addPeople(hanXin)
        .build();
    // 持久化
    outputStream.write(addressBook.toByteArray());
    outputStream.close();
}
private static void readAddressBook(File file) throws IOException {
    FileInputStream inputStream = new FileInputStream(file);
    AddressBookProto.AddressBook addressBook = AddressBookProto.AddressBook.parseFrom(inputStream);
    System.out.println(addressBook.getBookName() + ":");
    for (AddressBookProto.Person person : addressBook.getPeopleList()) {
        System.out.printf("编号:%d\t姓名:%s\n", person.getId(), person.getName());
        List<AddressBookProto.Person.PhoneNumber> phonesList = person.getPhonesList();
        System.out.printf("\t%s\t%s\n", "号码类型", "号码");
        for (AddressBookProto.Person.PhoneNumber phoneNumber : phonesList) {
            System.out.printf("\t%s\t%s\n", phoneNumber.getType(), phoneNumber.getNumber());
        }
    }
}

运行 main 方法,结果如下:

开始新增人员信息
新增通讯录人员信息成功
--------------
开始读取人员信息
七七的通讯录:
编号:1	姓名:韩信
	号码类型	号码
	MOBILE	17500001111
	WORK	18900002222
--------------

结果可以正常写入并读取出来,查看生成的address_book.txt 文件,内容如下:


七七的通讯录<韩信hanxin@proto.com"
17500001111"
18900002222
【探秘】二维异形件重叠移除算法:从度量到消除的实战解析 本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。 阅读详情

相关推荐

步进电机励磁模式

1. 励磁模式 步进电机的基本操作模式称为 励磁模式,能够使步进电机工作在全步模式,半步模式和微步模式,其中微步模式能够有效的降低步进电机相电流的噪声,能够改善步进电机固有的噪声震动问题。下面将介绍 3 种励磁模式。 2. 全步励磁模式 所谓全步模式,就是依据电机固有结构设计固定的步距角工作,一个电脉冲,步进电机前进一个步距角。这个步距角使电机设计结构所决定的,也可以理解为电机以最大的步距角旋转。 3. 半步励磁模式 半步模式是以电机固有的结构决定的步距角的一半角度进行步进旋转。如下图所示,步进

zhbi98 的技术 Blogs 5548

Protobuf在Java中的简单使用

系列导航 (一)Protobuf下载和编译 一、编写一个.proto文件 option java_package = "com.proto"; option java_outer_classname = "PersonProto"; message Person { required string name = 1; required int32 age = 2; } 注 1、这里使用的是protobuf 2版本,也就是默认版本,如果需要用到3版本,需要在头部加上 syntax = "prot.

赵昕彧 2012

基于YOLOv5与海康工业相机的高分辨率实时检测实践

本文详细介绍了基于YOLOv5与海康工业相机的高分辨率实时检测实践,通过优化相机配置、网络传输和YOLOv5模型适配,实现了每秒15帧以上的实时检测性能,缺陷识别准确率高达99.2%。特别适用于电子元件焊接点检测、精密齿轮齿痕检查等对微小缺陷敏感的场景。

weixin_30872499的博客 474

Netty 使用 Protobuf 序列化,真香!

点击关注公众号,Java干货及时送达作者:rickiyang出处:www.cnblogs.com/rickiyang/p/11074232.html我们来使用Protobuf进行序列化,它...

Java技术栈,分享最主流的Java技术 597

CSP-J 复试考点

可以用来训练思维,对于学习时间短的同学,动态规划可以帮助你迅速进入编程状态,也有助于帮你发现题目背后可能隐藏的更简便的算法。动态规划、贪心都是和子问题相关的,动态规划的基本思想是将一个大的问题划分成子问题,接着分别求解,而且能够将一些重复的计算记忆化,大大提高效率。难度加大,会涉及到二分、动态规划之类的算法,容易遗漏考虑点,不易得全分,考试的时候要注意全面性。一般是压轴题,算法不明显,剪枝的搜索、动态规划、状压 DP、树形 DP 、树、图等。枚举算法是指,列举出所有可能的取值,从中找出最优解。

GuanHeTian的博客 2214

“傻瓜”stata入门——熟悉操作界面

小白开始学习stata和matlab,零基础上手

nnpersistent的博客 4454

protobuf2简单介绍及在IDEA中的使用

文章目录一、protobuf2简单介绍1. 数据类型2. 简单示例二、在IDEA中使用1. 安装protobuf support2. pom.xml添加maven插件3. pom.xml添加依赖4. 添加.proto文件import path5. 生成.java文件 一、protobuf2简单介绍 protobuf相较于xml和json,更注重于数据序列化 优点:拥有更高的时间效率和空间效率 缺点:可读性差 1. 数据类型 .proto Notes Java double double

no_hot的博客 3478

手把手教你用微信小程序实现智能硬件音视频通话(含Linux/RTOS适配)

本文详细介绍了如何利用微信小程序硬件框架(WMPF)和音视频SDK,在智能硬件(包括Linux与RTOS设备)上实现音视频通话功能。文章从架构设计、设备端SDK集成、小程序VOIP插件开发到跨平台调试与性能优化,提供了全链路实战指南,帮助开发者打通微信小程序与嵌入式设备间的实时音视频通信。

ooo22的博客 328

序列化、反序列化原理和Protobuf实现机制

(1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;(2)

长沙老码农 8513

14、深入解析Sigma - Delta调制算法:从原理到应用

本博客深入解析了Sigma-Delta调制(SDM)算法的原理与应用,特别是在Super Audio CD(SA-CD)音频编码中的作用。文章探讨了传统SDM的局限性,并介绍了一系列改进型前瞻式SDM技术,如Trellis Sigma-Delta调制、高效网格Sigma-Delta调制和修剪树Sigma-Delta调制。这些技术通过降低计算复杂度和提升信号转换质量,在音频处理和无损数据压缩领域展现出巨大潜力。此外,博客还对不同SDM技术进行了性能比较,并分析了如何实现最大信噪比(SNR),为未来音频技术和数

tgb34567890的博客 421

目标检测YOLO实战应用案例100讲-基于激光雷达点云的三维目标检测算法研究

近几年来,在计算机视觉领域,利用深度学习卷积神经网络技术来实现各种任务的算法越来越多。毫米波雷达、相机、激光雷达、超声波雷达等车载传感器生产成本的降低,汽车的自动驾驶技术得到了飞速发展,在我们的日常生活中经常能看到该技术辅助汽车驾驶员进行行车。和非自动驾驶汽车相比,自动驾驶汽车存在诸多优点,如进一步减少交通事故,保障人身安全;提供安全合理的路线,避免交通拥堵;采用清洁无污染的电能作为汽车新能源,从而降低大气污染等。现如今,自动驾驶技术已经逐渐深入到各个领域并发挥着关键的作用。

qq_36130719的博客 3730

protobuf了解

https://www.jianshu.com/p/b33ca81b19b5

光明磊学习&积累的地方 211

k8s上分离集群seatunnel部署(生产推荐)

k8s上分离集群seatunnel部署(生产推荐)

寂夜了无痕的博客 883

【ProtoBuf】了解ProtoBuf和安装ProtoBuf

ProtoBuf

加油,考上985的研究生 2206

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Protobuf 了解

搭建Protobuf c++ vs工程。

fy291021851的博客 1142

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

了解一下ProtoBuf

序列化与反序列化 我们在进行网络通信调用的时候,总是需要将内存的数据块经过序列化,转换成为一种可以通过网络流进行传输的格式。而这种格式在经过了传输之后再经过序列化,能还原成我们预想中的数据结构。 那么我们对于这种用于中间网络传输的数据格式就有一定的要求。首先它可以准确地描述数据内容,在此基础上我们则希望它尽量的小。 最开始流行起来的是XML,可扩展标记语言。由于它可以用来标记数据、定义数据类型,所以用户可以自己定义数据自己的语言,从而让对不同的数据结构化成统一的格式称为了可能。 而另外一个我们熟知的

蜜糖的代码注释 553

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一文了解Protobuf

Protobuf摘要 Protobuf是Google开发的高效二进制数据序列化工具,相比JSON体积更小(减少30%-70%)、解析更快。其核心优势包括:通过预编译代码避免反射开销、支持跨语言/平台、可扩展性强。使用.proto文件定义数据结构(如字段类型、编号规则),通过protoc编译器生成目标语言代码。典型应用场景包括RPC通信(如Dubbo)和高性能数据存储,尤其适合对传输效率和解析性能要求严格的分布式系统。开发时需配置protoc环境,通过命令行编译.proto文件生成序列化类。

XHY的博客 1173

深入了解Protobuf

1.背景介绍 Protobuf,即Protocol Buffers,是Google开发的一种轻量级的、高效的、跨平台的序列化框架。它可以用于将复杂的数据结构转换为二进制格式,并在不同的系统之间进行传输。Protobuf 的设计目标是提供一种简单、高效、可扩展的方式来表示复杂的数据结构。 Protobuf 的核心概念是基于面向对象的数据结构,它使用了一种称为“一次性编码”(one-off enc...

AI天才研究院 435

一文了解protobuf

语⾔⽆关、平台无关:即 ProtoBuf ⽀持 Java、C++、Python 等多种语⾔,⽀持多个平台⾼效:即⽐ XML 更小、更快、更为简单扩展性、兼容性好:你可以更新数据结构,而不影响和破坏原有的旧程序指定语法,:使用 proto3 语法 ,未指定则使用proto2package 声明符:声明一个唯一的包名定义消息(message)类似与一个对象名,内部用于定义对象结构体对象内部字段定义//版本//插入集合限定符。

优快云博客技术,java高级工程师,业务层架构师,高级管理认证,毕业设计可以联系我 1355

了解rpc与protobuf

(remote Procedure call)远程程序调用。rpc能让你像调用本地方法一样去调用远程的方法,通过网络从远程计算机程序上请求服务。rpc可以是跨语言的,rpc服务端一门语言,rpc客户端可以是另外一门语言。比如服务端用golang,客户端用php。

jayLog的博客 1404

protobuf的了解与使用

是一套完整的 IDL(接口描述语言),出自Google,基于 C++ 进行的实现,开发人员可以根据 ProtoBuf 的语言规范生成多种编程语言(Golang、Python、Java 等)的接口代码。据说 ProtoBuf 所生成的二进制文件在存储效率上比 XML 高 3~10 倍,并且处理性能高 1~2 个数量级,这也是选择 ProtoBuf 作为序列化方案的一个重要因素之一。3)定义对应的文件addressbook.proto。5)使用生成的Python代码。4)编译.proto文件。

m0_57057282的博客 462

Protobuf了解一下?

ProtocolBuffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩...

tongtongjing1765的博客 1285

冰冰学习笔记:简单了解protobuf

protobuf的使用与学习

bingbing_bang的博客 4059

了解ProtoBuf -编码原理

文章目录前言一、编码结构二、Varints 编码三、ZigZag 编码Varint 类型**int32、int64、uint32、uint64****bool****enum 的例子:****64-bit 和 32-bit 类型** **fixed64、sfixed64、double**Length-delimited 类型string、bytes、EmbeddedMessage、repeated补充 packed 编码 前言 在对 ProtoBuf 做了一些基本介绍之后,这篇开始进入正题,深入 Prot

h2517956473的博客 578

详细了解 Protocol Buffers (protobuf)

protobuf详细介绍

qq_67637756的博客 1552
上一篇: juc 阻塞队列被问怕了,熬夜总结
下一篇: Elk搭建古诗搜索实战
Quince Q
博客等级 码龄7年 5粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值