API 常用的序列化协议详解

目录

JSON (JavaScript Object Notation)

XML (Extensible Markup Language)

Protocol Buffers (Protobuf)

MessagePack

Thrift

Avro

小结


API(Application Programming Interface,应用程序编程接口)在软件开发中扮演着至关重要的角色,不同的系统之间借助 API 可以通过网络进行数据交换。在数据交换过程中,序列化协议是实现数据结构转换为便于传输和存储格式的关键技术。序列化协议定义了如何将数据结构转换为一系列字节,以及如何将这些字节再转换回原始数据结构。常用的序列化协议有很多种,每种协议都有其特点和适用场景。本文将简单介绍下几种常用的序列化协议。

JSON (JavaScript Object Notation)

JSON是一种轻量级的数据交换格式,基于 JavaScript 的一个子集,对于人来说易于阅读和编写,同时对于机器来说也易于解析和生成。虽然基于 JavaScript 的子集,但也是独立于语言的,几乎所有的编程语言都提供了 JSON 数据格式的解析和生成库。

优点:

  • 数据格式简单,易于阅读和编写。
  • 易于解析,大多数现代编程语言都内置了对 JSON 的支持,或者有丰富的第三方库用于序列化与反序列化操作。

缺点:

  • 不支持注释。
  • 只有基本的数据类型,如字符串、数字、布尔值、数组和对象,可能导致数据解析错误。
  • 相对于二进制协议,传输效率较低。

XML (Extensible Markup Language)

XML 是一种可扩展标记语言,用于存储和传输数据。XML 被设计为具有自我描述性,可以自定义标签来描述数据内容。

优点:

  • 具有严格的层次结构,能够表达复杂的嵌套关系,可以自定义标签来描述数据元素。
  • 以文本形式展现,可以直接被人类阅读和编辑。
  • 有一套完善的 W3C 标准,被广泛接受并在多种应用场景下得到支持。

缺点:

  • 数据冗余,因为每个标签都需要完整的声明和闭合,导致在网络传输时消耗更多的带宽。
  • 解析 XML 通常比解析 JSON 更慢,尤其是在资源受限的环境下。
  • 相比 JSON,XML 的序列化和反序列化过程更加繁琐,需要处理命名空间、DTD 或其他验证机制。

Protocol Buffers (Protobuf)

Protobuf 是由 Google 开发的一种高效的、跨平台的、语言无关的序列化结构化数据的标准方式。

优点:

  • 效率高,采用二进制编码,序列化后的数据量小,解析速度快。
  • 数据结构预先定义在 .proto 文件中,编译器会生成对应语言的类和方法,保证类型安全。
  • 提供了向前向后兼容的能力,可以方便地处理数据结构的变化而无需破坏已有的通信协议。

缺点:

  • 学习成本相对较高,需要额外学习 .proto 文件的语法,并通过编译器生成代码。
  • 原始数据是二进制的,对于人工查看和编辑不友好,调试时不如 JSON 或 XML 直观。
  • 跨语言支持虽然广泛,但并不是所有语言都有官方支持或成熟的社区实现。

MessagePack

MessagePack 是一种高效的二进制序列化格式,类似于JSON,但以更紧凑的二进制格式存储。

优点:

  • 具备轻量化的特点,压缩率较高,适合网络传输。
  • 虽然是二进制格式,但借鉴了 JSON 的许多概念,相对容易理解。

缺点:

  • 因为是二进制格式,不如 JSON 易于调试。
  • 缺乏标准化组织的支持,生态也不如 JSON 和 XML 丰富。

Thrift

Thrift 是 Facebook 开发的一个跨语言的服务部署框架,同时也提供了对应的序列化协议。

优点:

  • 支持多种编程语言。
  • 具有较高的性能和可扩展性。
  • 支持复杂的服务定义。

缺点:

  • 社区支持相对较少。
  • 学习成本相对较高,需要额外学习 .thrift 文件的语法,并通过编译器生成代码。
  • 原始的数据是二进制的,对于人工查看和编辑不友好,调试时不如 JSON 或 XML 直观。

Avro

Avro 是 Apache 的一个项目,用于数据序列化。支持丰富的数据结构,并且可以进行无模式的序列化。

优点:

  • 无需在序列化数据中包含模式,因此数据大小更小。
  • 支持动态和强类型的语言。
  • 适合于数据密集型应用,如大数据处理。

缺点:

  • 相较于上文几个,社区和工具支持较少。

小结

在选择 API 的序列化协议时,需综合考虑以下几个因素:数据交互的性能要求、数据大小、跨平台和跨语言兼容性、开发团队的技术栈、未来维护及升级的便利性等因素。JSON因其实用性和普及程度,成为很多 API 接口的首选,而像 protobuf 这样的二进制格式更适合对性能有高要求、数据结构固定的场景。

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

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

相关文章

leetcode 673.最长递增子序列的个数

上一题只需要知道最长递增子序列的长度就行了,那样的话直接一个dp就完事了,但是呢,这里说了需要记录这个最长长度递增子序列的个数,这下的话,如果你想用原先的思路,其实可以,但是要能做到计数的…

vue3 (六)自定义指令

1.定义自定义指令: app.directive(pos,{mounted(el,bunding){el.style[bunding.arg] bunding.value px;}, updated(el,bunding){el.style[bunding.arg] bunding.value px;} }) app.directive(指令名,{ mounted(el,bunding){}, updated(el,bunding){} }) 如果只…

安卓app软件开发的费用

我们公司总结的开发价格根据安卓APP,苹果APP行业的报价,开发的APP软件费用主要受到两个方面的影响。安卓和苹果APP软件应用的复杂性,第二个是定制开发的APP软件,开发成本和人员的投入成本,以下就是不同的报价费用是怎么…

面试经典150题【51-60】

文章目录 面试经典150题【51-60】71.简化路径155.最小栈150.逆波兰表达式求值224.基本计算器141.环形链表2.两数相加21.合并两个有序链表138.随机链表的复制19.删除链表的倒数第N个节点82.删除链表中的重复元素II 面试经典150题【51-60】 71.简化路径 先用split(“/”)分开。然…

10. Nginx进阶-Return

简介 什么是Return? nginx的return指令是用于在nginx配置文件中进行重定向或返回特定的HTTP响应码的指令。 它可以根据不同的条件来执行不同的操作,如重定向到其他URL、返回指定的HTTP响应码或自定义响应内容等。 Return适用范围 return指令只能在se…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

rabbitmq基础(1)

1、背景 能实现消息队列的框架软件有很多&#xff0c;kafka、rabbitmq、RocketMq、activeMq、Redis&#xff08;非专业&#xff09;&#xff0c;各有各的特点和优缺点。但是之前的公司数据需求规模并非很大&#xff0c;所以采用rabbitmq作为消息队列。 2、rabbitMq的基础架构…

大批量接口请求的前端优化

接到一个需求&#xff0c;需要做一个运维的功能&#xff0c;对公司下平台子系统做一个开关界面&#xff0c;要求可以大批量对系统进行修改。这样大批量的修改&#xff0c;如果有个老哥手一抖点了全选&#xff0c;那可能同时会发送几十上百个接口&#xff0c;对浏览器和服务器都…

C++面试宝典【配文档,全方面学习】

原word文档[链接: https://pan.baidu.com/s/1CKnm7vHDmHSDskAgxgZgKA?pwdr4wv 提取码: r4wv 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v5的分享] 一、C / C基础 1、简述C的内存分区&#xff1f; 一个C、C程序的内存分区主要有5个…

使用html网页播放多个视频的几种方法

前言 因为项目测试需要&#xff0c;我需要可以快速知道自己推流的多路视频流质量&#xff0c;于是我想到可以使用html网页来播放视频&#xff0c;实现效果极其简单&#xff0c;方法有好几种&#xff0c;以下是几种记录&#xff1a; 注意&#xff1a;测试过&#xff0c;VLC需要使…

Java:类加载器

参考 JavaGuide 简介 类加载器的主要作用是加载Java类的字节码即.class文件到JVM中。每个Java类都有一个引用指向加载它的类加载器。数组类是JVM直接生成而非加载的。根据需要动态加载&#xff0c;已加载的类放到ClassLoader中&#xff0c;相同二进制名称的类只会被加载一次…

C++从零开始的打怪升级之路(day43)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于多态的知识点 1.多态的概念及定义&#xff0c;…

[Python] 添加重试机制来处理某些可能出现异常的函数

在 Python 中&#xff0c;如果你想要添加重试机制来处理某些可能出现异常的函数&#xff0c;可以使用 retry 装饰器。虽然 Python 标准库中没有提供内置的 retry 装饰器&#xff0c;但你可以使用第三方库 tenacity 来实现这个功能。 tenacity 是一个流行的 Python 库&#xff…

Ubuntu18.04运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18) 文章目录 ORB-SLAM3复现(ubuntu18)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calibration…

STM32类别概述、下载程序及启动过程分析

STM32类别概述、下载程序及启动过程分析 STM32类别STM32下载程序STM32启动过程分析 STM32类别 STM32 目前总共有 5 大类&#xff0c;18 个系列 结合 STM32F1 的芯片来说&#xff0c;其 CMSIS 应用程序的简单结构框图&#xff0c;不包括实时操作系统和 中间设备等组件&#xf…

find函数-秒了道题

秒了 笑死 还是规规矩矩做吧 string类的find()函数用于在字符串中查找字符或子串&#xff0c;返回第一个匹配的位置。 class Solution { public:int strStr(string haystack, string needle) {return haystack.find(needle);} };

搜维尔科技:Manus Prime X系列手套介绍,由 PrimeXMarkerMocap 和Prime X Haptic VR 手套组成

搜维尔科技&#xff1a;Manus Prime X系列手套介绍&#xff0c;由 PrimeXMarkerMocap 和Prime X Haptic VR 手套组成 Manus Prime X&#xff08;点击进入官网&#xff09;系列手套介绍&#xff0c;由 PrimeXMarkerMocap 和Prime X Haptic VR 手套组成

深入理解操作系统Operator System(1)

目录 OS概念 设计OS的目的 OS定位 操作系统对下的结构层次示意图 理解操作系统的"管理"❗❗ "管理"被管理者的数据 怎么获取被管理者的数据 获取被管理者什么"数据" 数据过多&先描述再组织❗ C/C中的体现 解释OS对硬件的"管…

RabbitMQ(控制台模拟收发消息与数据隔离)

1.RabbitMQ架构图 publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchange&…

获取数据库最新的一条打卡时间数据SQL语句

获取数据库最新的一条打卡时间数据SQL语句 上班表创建SQL语句 CREATE TABLE "PunchIn" ("id" INT NOT NULL,"emp_code" VARCHAR(50) NOT NULL COLLATE Chinese_PRC_CI_AS,"punch_in_time" DATETIME NOT NULL,"status" VAR…