当前位置: 首页 > news >正文

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字符串:

http://www.lryc.cn/news/414233.html

相关文章:

  • Java面试题:SpringBean的生命周期
  • 50 IRF检测MAD-BFD
  • SpringSecurity-1(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)
  • Java高级
  • python实现图像分割算法3
  • 解密XXE漏洞:原理剖析、复现与代码审计实战
  • Spring Boot集成Resilience4J实现限流/重试/隔离
  • 谷粒商城实战笔记-119~121-全文检索-ElasticSearch-mapping
  • Java 并发编程:Java 线程池的介绍与使用
  • ubuntu上安装HBase伪分布式-2024年08月04日
  • Mojo的特征与参数(参数化部分)详解
  • C++数组、vector求最大值最小值及其下标
  • 内网安全:多种横向移动方式
  • 搭建 STM32 网关服务器的全流程:集成嵌入式 C++、TCP/IP 通信、Flash 存储及 JWT 认证(含代码示例)
  • 一款免费强大的电脑锁屏工具,中文绿色免安装
  • Python | Leetcode Python题解之第319题灯泡开关
  • 前端Web-JavaScript(上)
  • 【积累】Python的类
  • Golang | Leetcode Golang题解之第318题最大单词长度乘积
  • 【感想】支持八股文在面试的应用
  • B - 02-计算球的体积 51Nod - 3266
  • Qt pro文件详解
  • JavaFX布局-ButtonBar
  • 【C++程序设计】——利用数组处理批量数据(二)
  • 使用 1panel面板 部署 php网站
  • Windows调大虚拟内存来代替升级物理运行内存(RAM)真的有用吗?
  • [Unity] ShaderGraph实现DeBuff污染 溶解叠加效果
  • java算法day28
  • vue实现歌词滚动效果
  • 【算法设计题】合并两个非递减有序链表,第1题(C/C++)