码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 序列化和反序列化


    在网络通信的过程中,我们要传递的可能不仅仅只是一个字符串,我们可能需要传更为复杂的结构,比如结构体类型,这种时候我们要用到序列化和反序列化。

    假设张三和李四在用QQ聊天,张三给李四发了条消息“你好,我是张三”,这个时候,看起来像是只发了一个字符串,实际上,张三的昵称、发送消息的时间都要发送到李四的主机上。


    目录

    一、什么是序列化和反序列化

    二、为什么需要序列化和反序列化(序列化和反序列化的优点)

    1、方便传输

    2、实现应用层显示和网络传输的解耦

    三、如何序列化和反序列化?

    1、安装jsoncpp-devel

    2、序列化(结构体 转化成 json字符串)

    (1) 准备工作:声明结构体

    (2) 开始序列化

    3、反序列化(json字符串 转化成 结构体)


    一、什么是序列化和反序列化

    因为结构体不便于传输,一般需要将结构体转化为一个“长的字符串”,然后再送入网络,这个过程我们称为序列化。

    相对应的,李四那边在接收的时候,需要将这个长字符串转化为对方能够识别的形式,如结构体,这个过程我们称为反序列化。

    二、为什么需要序列化和反序列化(序列化和反序列化的优点)

    1、方便传输

    介于结构体对齐原则,结构化的数据不便于用于网络传输

    或许你觉得,既然整个结构体传输不行,那就将结构体的每个成员以字符串的形式一个一个传过去,这么做理论上可行,但是一台主机可能会收到多个主机发来的数据,这个时候,就很难区分是哪个主机发的数据。

    2、实现应用层显示和网络传输的解耦

    假设张三发送一个字符串 "10 + 20",让李四去计算,如果不经过序列化,而是直接发送的话,传递确实很方便,但是站在李四的角度,解析的成本可太高了。

    如果我们将一个结构体转化为字符串(即序列化),李四接收的时候,再转化回结构体,这样的话,李四无需知道这个字符串是如何解析的。因为李四和张三手里的东西是一样的,下面只要定好协议,让李四知道传过来的东西怎么使用即可。这就实现了网络传输和上层显示的解耦!!

    三、如何序列化和反序列化?

    为了实现序列化和反序列化,前人已经有了相应的处理方案,比如xml、json、protocbuff等,这里主要介绍将结构体类型转化为json格式,以及json转结构体类型。

    1、安装jsoncpp-devel

    根据不同的用户类型,自行选择对应的安装方式

    1. sudo yum install -y jsoncpp-devel //普通用户
    2. yum install -y jsoncpp-devel //超级用户

    安装成功输入如下指令查看是否有对应的头文件

    2、序列化(结构体 转化成 json字符串)

    (1) 准备工作:声明结构体

    假设现在要将一个结构体传输给对面,下面就先声明一个简单的结构体

    1. //送入网络的,我们作为请求
    2. typedef struct Request{
    3. int x;
    4. char op;
    5. char* msg;
    6. } request_t;

    (2) 开始序列化

    为了理解这个过程,我以我们熟知的动画为例。海绵宝宝准备好了原材料root,放到铁板上煎,经过一些操作,就得到了一个汉堡。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(){
    5. request_t req = {10,'+',"Hello,world"}; //初始化结构体
    6. Json::Value root; //原材料root
    7. root["datax"] = req.x; //放到铁板上的指定位置
    8. root["dataop"] = req.op;
    9. root["datamsg"] = req.msg;
    10. Json::FastWriter writer;
    11. //Json::StyledWriter writer; //这两种写法都可以,至于区别,可以看看打印的结果
    12. std::string json_str = writer.write(root); //汉堡制作完成
    13. return 0;
    14. }

    测试结果如下:

    ======================= StyledWriter =======================

    ======================= FastWriter =======================

    3、反序列化(json字符串 转化成 结构体)

    现在痞老板偷到了 蟹老板的独家汉堡,痞老板用高科技的机器分解了这个汉堡,将分解成了原材料的状态,放在托盘上,以便于观察到底用了哪些材料来制作汉堡。

    1. //中间的引号需要使用'\'转义
    2. std::string json_str = "{\"datamsg\":\"Hello,world\",\"dataop\":43,\"datax\":10}";
    3. Json::Reader reader;
    4. Json::Value root;
    5. reader.parse(json_str,root); //若转化为root以后不便于参数传递,下面填到req里
    6. request_t req;
    7. req.x = root["datax"].asInt(); //root中每个key对应的value都是Json::Value类型
    8. req.op = root["dataop"].asInt();
    9. req.msg = root["datamsg"].asString().c_str();
    10. cout<" "<" "<

    测试结果如下:

  • 相关阅读:
    “懒宅经济”崛起,智能家电品牌快收好这份软文推广指南
    JVM支持的可配置参数查看和分类
    基于 vue-element-template 框架添加 tagsview
    方法论系列:用四个金字塔来说明金字塔原理
    全国电费优惠接口CPS分享
    R语言ggplot2可视化:ggcharts包的bar_chart函数可视化条形图、bar_chart函数自动排序条形图并水平显示
    玩客云刷机
    [Python]图片转字符画——这就是我的表情!!!!!!
    Dreamweaver网页设计与制作100例——HTML5期末考核大作业——票务网站整套网页
    2023年【危险化学品生产单位安全生产管理人员】及危险化学品生产单位安全生产管理人员模拟考试题
  • 原文地址:https://blog.csdn.net/challenglistic/article/details/125826118
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号