1. protobuf学习
文章目录
- 1. protobuf介绍
- 1.1 ProtoBuf使用场景说明
- 2. 其他序列化介绍
- 2.1 Json
- 2.1.1 使用Json序列化
- 2.1.2 Json反序列化
- 2.2 其他可选地序列化和反序列化
- 3. protoBuf
- 3.1 protobuf数据类型
- 3.2 protobuf使用步骤
- 3.2.1 定义proto文件
- 3.2.2 编译proto文件
- 3.2.2.1 安装protocol buffers
- 3.2.2.2 编译proto文件
- 3.2.3 使用API
- 3.3 扩展时的注意事项
- 3.4 不同版本差异
本文在学习的角度出发,进行protobuf的使用场景和功能介绍。
原文
1. protobuf介绍
- ProtoBuf是中立于编程语言和编程平台的,可扩展的用于序列化结构化数据的解决方案,是Google公司开发的一种数据描述语言,可用于数据存储、通信协议等方面。
- 定义完你所需要的数据结构后,你可以基于protoBuf生成各种语言的代码,这些定义的数据流可以轻松地被传递且不会破坏你已有的程序。并且你也可以更新你的结构体而现有的代码也不会收到任何影响。
- protoBuf目前支持Objective-C、C++、C#、Jave、Python、Go、PHP、JavaScript等主流语言。
1.1 ProtoBuf使用场景说明
工作中结构体数据的传输不仅仅局限于在函数之间传递,常规的函数间传递结构体并不需要做任特殊处理,但在实际中结构体数据的传输可能会在不同的APP之间,例如网络间传输。又或者是相同进程的不同版本,你和你的小伙伴的微信版本很可能是不同的。
例如下面这样一个结构体信息,这可能是一个微信的名片:
typedef struct User{char ID[20];int age;char gender;
}User;User Boss = {"wxid_we48fhb14", 18, 1};
假设分享者分享名片时,使用如下代码发送:
sendto(sockfd, (void*)&Boss, sizeof(User),0,dest_addr,sizeof(struct sockaddr))
服务端采用如下代码接收:
char buf[1024] = {0};recvfrom(sockfd, buf, 1024, 0, NULL, NULL);//不保存数据包来源地址和地址类型长度User* pUser = (User*)buf;pUser->ID;pUser->age;
这种简单的序列化的做法是,将传输的对象Boss转换为void*进行传输,在接收端进行反序列化就是将void*强转为结构体类型,这种方式是没有问题的。
但是这个前提是认为在发送端和接收端对于User结构体的认知是相同的,如果接收端的版本比较新,对于User的定义是这样的:
typedef struct User{char ID[20];int age;char gender;char province;char city;
}User;
此时在接收端进行解析数据是就会发生错误,这种情况下就需要序列化的数据传输格式。
2. 其他序列化介绍
以下介绍的方法是可用且常用的序列化方法,但是其性能并不是特别好。如果对于性能没有强烈的需求,使用起来并没有任何问题。
2.1 Json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于其他编程语言的文本方式来存储和表示数据,同时也易于机器解析和生成,一般用于网络传输。
同时易于人阅读和编写,在一些配置脚本中也可使用json书写。
比如上面的,使用Json表示的话,可以表示为:
{"ID":"wxid_we48fhb14","age":18,"gender":1,"province":25
}
2.1.1 使用Json序列化
C++有json的库,我们将结构体数据转化为json字符串:
相关文章:
1. protobuf学习
文章目录 1. protobuf介绍1.1 ProtoBuf使用场景说明2. 其他序列化介绍2.1 Json2.1.1 使用Json序列化2.1.2 Json反序列化2.2 其他可选地序列化和反序列化3. protoBuf3.1 protobuf数据类型3.2 protobuf使用步骤3.2.1 定义proto文件3.2.2 编译proto文件3.2.2.1 安装protocol buffe…...
Java面试题:SpringBean的生命周期
SpringBean的生命周期 BeanDefinition Spring容器在进行实例化时,会将xml配置的信息封装成BeanDefinition对象 Spring根据BeanDefinition来创建Bean对象 包含很多属性来描述Bean 包括 beanClassName:bean的类名,通过类名进行反射 initMethodName:初始化方法名称 proper…...
50 IRF检测MAD-BFD
IRF 检测MAD-BFD IRF配置思路 网络括谱图 主 Ten-GigabitEthernet 1/0/49 Ten-GigabitEthernet 1/0/50 Ten-GigabitEthernet 1/0/51 备 Ten-GigabitEthernet 2/0/49 Ten-GigabitEthernet 2/0/50 Ten-GigabitEthernet 2/0/51 1 利用console线进入设备的命令行页…...
SpringSecurity-1(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)
SpringSecurity 1 初识权限管理1.1 权限管理的概念1.2 权限管理的三个对象1.3 什么是SpringSecurity 2 SpringSecurity第一个入门程序2.1 SpringSecurity需要的依赖2.2 创建web工程2.2.1 使用maven构建web项目2.2.2 配置web.xml2.2.3 创建springSecurity.xml2.2.4 加载springSe…...
Java高级
类变量/静态变量package com.study.static_; 通过static关键词声明,是该类所有对象共享的对象,任何一个该类的对象去访问他的时候,取到的都是相同的词,同样任何一个该类的对象去修改,所修改的也是同一个对象. 如何定义及访问? 遵循相关访问权限 访问修饰符 static 数据类型…...
python实现图像分割算法3
python实现区域增长算法 算法原理基本步骤数学模型Python实现详细解释优缺点应用领域区域增长算法是一种经典的图像分割技术,它的目标是将图像划分为多个互不重叠的区域。该算法通过迭代地合并与种子区域相似的邻域像素来实现分割。区域增长算法通常用于需要精确分割的场景,如…...
解密XXE漏洞:原理剖析、复现与代码审计实战
在网络安全领域,XML外部实体(XXE)漏洞因其隐蔽性和危害性而备受关注。随着企业对XML技术的广泛应用,XXE漏洞也逐渐成为攻击者们利用的重点目标。一个看似无害的XML文件,可能成为攻击者入侵系统的利器。因此,…...
Spring Boot集成Resilience4J实现限流/重试/隔离
1.前言 上篇文章讲了Resilience4J实现熔断功能,文章详见:Spring Boot集成Resilience4J实现断路器功能 | Harries Blog™,本篇文章主要讲述基于Resilience4J实现限流/重试/隔离。 2.代码工程 pom.xml <dependency><groupId>io…...
谷粒商城实战笔记-119~121-全文检索-ElasticSearch-mapping
文章目录 一,119-全文检索-ElasticSearch-映射-mapping创建1,Elasticsearch7开始不支持类型type。2,mapping2.1 Elasticsearch的Mapping 二,120-全文检索-ElasticSearch-映射-添加新的字段映射三,121-全文检索-Elastic…...
Java 并发编程:Java 线程池的介绍与使用
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 024 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…...
ubuntu上安装HBase伪分布式-2024年08月04日
ubuntu上安装HBase伪分布式-2024年08月04日 1.HBase介绍2.HBase与Hadoop的关系3.安装前言4.下载及安装5.单机配置6.伪分布式配置 1.HBase介绍 HBase是一个开源的非关系型数据库,它基于Google的Bigtable设计,用于支持对大型数据集的实时读写访问。HBase有…...
Mojo的特征与参数(参数化部分)详解
许多语言都具有元编程功能:即编写生成或修改代码的代码。Python 具有动态元编程功能:装饰器、元类等功能。这些功能使 Python 非常灵活且高效,但由于它们是动态的,因此会产生运行时开销。其他语言具有静态或编译时元编程功能,如 C 预处理器宏和 C++ 模板。这些功能可能受到…...
C++数组、vector求最大值最小值及其下标
使用 <algorithm> 头文件来查找数组或向量中最大值、最小值及其索引 #include <iostream> #include <vector> #include <algorithm> // 包含 std::max_element 和 std::min_elementint main() {std::vector<int> vec {3, 1, 4, 2, 5};// 查找最…...
内网安全:多种横向移动方式
1.MMC20.Application远程执行命令 2.ShellWindows远程执行命令 3.ShellBrowserWindow远程执行命令 4.WinRM远程执行命令横向移动 5.使用系统漏洞ms17010横向移动 DCOM: DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。它支持不同…...
搭建 STM32 网关服务器的全流程:集成嵌入式 C++、TCP/IP 通信、Flash 存储及 JWT 认证(含代码示例)
引言 随着物联网(IoT)技术的快速发展,基于 STM32 的服务器(类似网关)在数据采集、设备控制等方面的应用越来越广泛。本文将介绍搭建一个基于 STM32 的服务器所需的技术栈,以及详细的搭建步骤和代码示例。 …...
一款免费强大的电脑锁屏工具,中文绿色免安装
这款软件主要特点是锁屏后不显示密码输入框,直接输入密码即可解锁。 ScreenBlur是一款功能强大的电脑屏幕锁软件,主要用于保护用户的隐私和数据安全。该软件的主要功能包括自动锁屏、隐藏桌面、加密锁机等。 功能特点 自动锁屏:用户可以设…...
Python | Leetcode Python题解之第319题灯泡开关
题目: 题解: class Solution:def bulbSwitch(self, n: int) -> int:return int(sqrt(n 0.5))...
前端Web-JavaScript(上)
要想让网页具备一定的交互效果,具有一定的动作行为,还得通过JavaScript来实现, 这门语言会让我们的页面能够和用户进行交互。 什么是JavaScript JavaScript(简称:JS) 是一门跨平台、面向对象的脚本语言,是…...
【积累】Python的类
类和方法的概念及实例 类 (Class):类是对具有相同属性和方法的对象集合的抽象描述。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 方法:类中定义的函数。 构造方法 __init__():这是一个特殊的方法,会在类实例…...
Golang | Leetcode Golang题解之第318题最大单词长度乘积
题目: 题解: func maxProduct(words []string) (ans int) {masks : map[int]int{}for _, word : range words {mask : 0for _, ch : range word {mask | 1 << (ch - a)}if len(word) > masks[mask] {masks[mask] len(word)}}for x, lenX : ra…...
MangoHud资源占用实时监控:图表工具终极指南
MangoHud资源占用实时监控:图表工具终极指南 【免费下载链接】MangoHud A Vulkan and OpenGL overlay for monitoring FPS, temperatures, CPU/GPU load and more. Discord: https://discordapp.com/invite/Gj5YmBb 项目地址: https://gitcode.com/gh_mirrors/ma/…...
为什么操作 UI 必须加 `lcd_mutex` 互斥锁?不用会怎样?
1. 先给结论(你必须记住) LVGL 所有界面操作(创建文字、按钮、刷新屏幕)都不是线程安全的。 意思是: 绝对不能有两个线程同时操作 LVGL 界面! 线程A:LVGL 主线程(一直在刷新屏幕&…...
Verilog进阶实战:独热码状态机设计序列检测器的核心技巧
1. 独热码状态机的设计哲学 第一次接触独热码(One-Hot)编码时,我盯着那串只有一个1的状态编码看了半天——这不就是硬件版的"单选题"吗?每个状态都有自己的专属VIP通道,这种设计理念在中小规模状态机中简直是降维打击。记得去年做电…...
手把手教你解决Unity视频播放问题:H264编码设置与RawImage的正确用法
Unity视频播放全攻略:H264编码优化与RawImage实战解析 在Unity项目开发中,视频播放功能看似简单,却暗藏诸多技术细节。许多开发者都曾遇到过视频不同步、颜色失真或性能低下的困扰。本文将深入剖析视频播放的核心技术要点,从编码格…...
Cursor+Qt5.12.12开发环境配置全攻略:从插件安装到项目构建
CursorQt5.12.12开发环境配置全攻略:从插件安装到项目构建 对于刚接触Qt开发或从其他IDE迁移到Cursor的开发者来说,配置一个高效的开发环境是首要任务。Qt5.12.12作为长期支持版本(LTS),在稳定性和兼容性方面表现优异,而Cursor作为…...
后端架构师转型AI智能体架构师:3个月实战路径,收藏这份落地指南
如果你本身就是后端/全栈/架构师出身,这意味着你已经有了一套非常扎实的“确定性系统”的构建能力——分布式、高并发、数据库事务、系统稳定性,这些都是你的底牌。 而AI智能体恰恰是“不确定性系统”(大模型)与“确定性系统”&am…...
模型timm/ViT-B-16-SigLIP简要介绍及其应用场景
目录一、timm/ViT-B-16-SigLIP 是什么模型二、模型结构(核心架构)1️⃣ 图像编码器2️⃣ 文本编码器3️⃣ 对齐训练三、为什么叫 ViT-B-16四、在 timm 中如何使用五、典型应用场景1️⃣ Zero-shot 图像分类2️⃣ 图文检索(Image-Text Retriev…...
智能客服方案库物流JSON格式优化:从数据冗余到高效解析
在智能客服系统中,物流信息的查询与展示是高频核心功能。随着业务增长,我们方案库中存储和传输的物流JSON数据日益庞大。最初为了图省事,我们采用了“全量字段”的设计,即每次接口返回都包含物流单号、状态、时间、承运商、路由节…...
3分钟完成Axure RP中文界面汉化:终极完整指南
3分钟完成Axure RP中文界面汉化:终极完整指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axu…...
建行江门市分行:银发关爱在行动 暖心服务送到家
服务无边界。近日,建行广东江门分行辖内多家网点接连上演暖心一幕,员工们主动跨出柜台,将金融服务送到客户家中、病房前,用一次次“特事特办”的上门服务,化解客户的“燃眉之急”,生动诠释了“以客户为中心…...
