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

Linux网络:序列化与反序列化

引入:面向字节流

TCP是面向字节流的,如果按照字节流来读取信息,可能会出问题
比如客户传入“1+100”,服务器读入“1+1”,后面的00被当作下一条信息,这就出问题了

我们可以将多个信息合并为一个字符串
在发送信息时,将信息按照规则转化为一个字符串再传过去。服务器端收到后,再解析字符串获得完整信息

这就是序列化与反序列化

在这里插入图片描述

JSON简介

JSON 是一种轻量级的数据交换格式,具有良好的可读性和结构性。它支持的数据类型包括字符串、数值、布尔值、数组、对象和 null

C++ 中常用的 JSON 库包括:

  • nlohmann/json
  • RapidJSON
  • JsonCpp

本文会涉及nlohmann/json和JsonCpp


Json类型

Json支持三种基本结构:标量、数组和对象

标量类型

标量是最基本的数据类型,JSON 中支持以下几种标量类型:

类型示例说明
字符串"hello"必须用双引号括起来的文本
数字123, 3.14可为整数或小数(不支持 NaN 等)
布尔值true, false小写,表示逻辑值
空值null表示空或无值

数组

数组是一组有序的数据集合,用 [] 表示,元素之间用逗号分隔。

[18, 180, 170, "lihua", true, null]
  • 可以包含不同类型的数据(数字、字符串、对象等)
  • 数组下标从 0 开始

对象

对象是一组键值对集合,用 {} 表示,键必须是字符串。

{"name": "Alice","age": 25,"isStudent": false
}
  1. 每个“键”都是字符串

像最开始举的例子:1+100,就可以表示为

{"left": 1,"operator": "+","right": 100
}
  1. “值”可以是标量、数组或另一个对象 (即支持嵌套)
    像下面这样
{"user": {"name": "LiHua","age": 18,"languages": ["C++", "Python", "Go"],"active": true,"profile": null}
}
  • user 是一个对象
  • “name” 是字符串,属于标量
  • “age” 是数字,属于标量
  • “languages” 是数组,数组中是字符串
  • “active” 是布尔值
  • “profile” 是空值 null

给出一个创建 JSON 的例子。

#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;int main() {json j;j["name"] = "Tom";j["age"] = 25;j["scores"] = {90, 85, 92};std::cout << j.dump(4) << std::endl;  // 4格缩进return 0;
}

输出结果:

{"age": 25,"name": "Tom","scores": [90,85,92]
}

<nlohmann/json.hpp>

nlohmann/json 是一个头文件式的现代 C++ JSON 库,使用时只需包含一个头文件即可:

#include <nlohmann/json.hpp>
using json = nlohmann::json;

序列化与反序列化

序列化(Writer)

序列化即将对象转成字符串形式,用于存储或传输。使用 .dump() 方法可完成序列化。

json j;
j["title"] = "C++ JSON";
j["version"] = 1.0;
j["tags"] = {"serialization", "json", "cpp"};std::string output = j.dump();        // 无缩进
std::string formatted = j.dump(4);    // 缩进4格格式化std::cout << output << std::endl;

输出:

{"tags":["serialization","json","cpp"],"title":"C++ JSON","version":1.0}

3.2.2 反序列化(Reader)

反序列化是将 JSON 字符串解析为 json 对象。可以使用 json::parse() 方法。

std::string input = R"({"name": "ming","age": 30,"active": true
})";json j = json::parse(input);std::string name = j["name"];
int age = j["age"];
bool active = j["active"];std::cout << "Name: " << name << ", Age: " << age << ", Active: " << std::boolalpha << active << std::endl;

输出:

Name: ming, Age: 30, Active: true

总结

介绍了序列化和反序列化的使用

http://www.dtcms.com/a/286602.html

相关文章:

  • web-storage-cache离线缓存技术的详细讲解与使用
  • 虚拟商品自动化实践:闲鱼订单防漏发与模板化管理的技术解析
  • 零售行业 AI 客户咨询对话系统实战指南
  • 深入理解Linux文件操作:stdin/stdout/stderr与C语言文件函数全解析
  • 【实战】一次出口连接数超限事故引发的架构反思:强制代理、NAT 网关与大厂最佳实践
  • 网络编程(modbus,3握4挥)
  • 【C#】引用(Reference)句柄(Handle)
  • 库的制作与原理
  • 退信、延迟、遇攻击?CACTER 邮件安全海外中继:让跨境通邮 “零障碍”
  • 【前后端】沙箱机制
  • gcc 源码分析:从IR-RTL 到汇编输出
  • C++ 程序 AddressSanitizer:DEADLYSIGNAL
  • 自动化面试题
  • spring-cloud微服务部署转单体部署-feign直连调用
  • 磁悬浮轴承系统中由不平衡力引发的恶性循环机制深度解析
  • 初探:C语言FILE结构之文件描述符与缓冲区的实现原理
  • 前端 SSE 实战应用:用最简单的方式实现实时推送
  • Python基础④-装饰器、迭代器及常用函数篇
  • 在断网情况下,网线直接连接 Windows 笔记本和 Ubuntu 服务器进行数据传输
  • 高性能数据库-Redis详解
  • verilog tb文件 美化terminal输出
  • Webpack 项目构建优化详解
  • 雪豹大模型驱动效率革命 华鼎冷链科技重构餐饮供应链神经网络
  • 进程 线程 并发 并行
  • 安达发|从救火到未雨绸缪:APS生产计划排产软件重塑制造业“危机免疫力“
  • 2025年6月电子学会全国青少年软件编程等级考试(Python一级)真题及答案
  • 添加DNS解析记录时,提醒记录冲突是怎么回事?
  • Python练习2-格式化输出基本数据类型及变量的详细使用
  • Aqara 携手西门子西碳迹SiTANJI,发布亚马逊 CPF 绿标解决方案标杆案例
  • 根据用户id自动切换表查询