19.7 Boost Asio 传输序列化数据

序列化和反序列化是指将数据结构或对象转换为一组字节,以便在需要时可以将其存储在磁盘上或通过网络传输,并且可以在需要时重新创建原始对象或数据结构。

序列化是将内存中的对象转换为字节的过程。在序列化期间,对象的状态被编码为一组字节,并可以保存或传输到另一个位置。序列化后的字节可以在之后进行反序列化,以将对象重建为在序列化之前的状态。

反序列化则是将字节序列重新转换为对象或数据结构的过程。在反序列化期间,字节被反转回原始对象的状态,以便它可以被使用或操作。

在Boost库中,提供了text_oarchivetext_iarchive于将C对象序列化为文本格式并将其反序列化回去,使用text_oarchive可以将C对象以可读文本形式输出,以便在文件或网络上进行存储或传输,与之对应的text_iarchive则可以将先前序列化的文本格式数据还原为C对象。

首先来看服务端代码,在代码中我们定义一个自定义MyDate结构体,该结构体内包含了一个serialize该函数适用于序列化与反序列化时使用的,当我们调用struct_load函数时,就会触发这个序列化方法,从而将接收到的序列化数据包反序列化为对应的结构体变量,这样我们就可以自由的解析内部参数。

#include <iostream>
#include <sstream>
#include <boost/asio.hpp>#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>using namespace std;
using namespace boost::asio;typedef struct MyDate
{unsigned int m_day;unsigned int m_month;unsigned int m_year;MyDate(int d, int m, int y){m_day = d;m_month = m;m_year = y;}MyDate(){m_day = 0;m_month = 0;m_year = 0;}template<typename Archive>void serialize(Archive& archive, const unsigned int version){archive & BOOST_SERIALIZATION_NVP(m_day);archive & BOOST_SERIALIZATION_NVP(m_month);archive & BOOST_SERIALIZATION_NVP(m_year);}
}MyDate;MyDate struct_load(std::string load_string)
{MyDate item;std::istringstream is(load_string);boost::archive::text_iarchive archive(is);archive >> item;return item;
}int main(int argc, char* argv[])
{io_service io_service;ip::tcp::acceptor acceptor(io_service, ip::tcp::endpoint(ip::tcp::v4(), 6666));ip::tcp::socket socket(io_service);acceptor.accept(socket);boost::system::error_code error_code;// 接收序列化后的数据char recv_buffer[8196] = { 0 };socket.read_some(boost::asio::buffer(recv_buffer, 8196), error_code);// 反序列化接收到的数据MyDate ptr;ptr = struct_load(recv_buffer);std::cout << "反序列化: " << ptr.m_year << std::endl;std::system("pause");return 0;
}

接着我们来分析一下客户端代码实现,对于客户端而言我们同样需要定义一个完全一致的MyDate结构体,当调用struct_save函数时则会将传入的结构体参数序列化为一个字符串,此时通过调用write_some即可将压缩后的结构体传输给服务端。

#include <iostream>
#include <sstream>
#include <string>
#include <boost/asio.hpp>#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>using namespace std;
using namespace boost::asio;typedef struct MyDate
{unsigned int m_day;unsigned int m_month;unsigned int m_year;MyDate(int d, int m, int y){m_day = d;m_month = m;m_year = y;}MyDate(){m_day = 0;m_month = 0;m_year = 0;}template<typename Archive>void serialize(Archive& archive, const unsigned int version){archive & BOOST_SERIALIZATION_NVP(m_day);archive & BOOST_SERIALIZATION_NVP(m_month);archive & BOOST_SERIALIZATION_NVP(m_year);}
}MyDate;std::string struct_save(MyDate *ptr)
{std::ostringstream os;boost::archive::text_oarchive archive(os);archive & BOOST_SERIALIZATION_NVP(*ptr);std::string content = os.str();return content;
}int main(int argc, char* argv[])
{io_service io_service;ip::tcp::socket socket(io_service);ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 6666);boost::system::error_code error_code;socket.connect(ep, error_code);// 序列化为字符串MyDate save_data(12, 7, 1997);std::string save_string = struct_save(&save_data);std::cout << "序列化后: " << save_string << std::endl;// 发送给服务端socket.write_some(boost::asio::buffer(save_string), error_code);std::system("pause");return 0;
}

读者可自行编译运行这段代码片段,当两个程序运行时则会实现结构体的远程传输功能,如下图所示;

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

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

相关文章

数字化转型:云表低代码开发助力制造业腾飞

数字化转型已成为制造业不可避免的趋势。为了应对市场快速变化、提高运营效率以及降低成本&#xff0c;制造业企业积极追求更加智能化、敏捷的生产方式。在这个转型过程中&#xff0c;低代码技术作为一种强大的工具&#xff0c;正逐渐崭露头角&#xff0c;有望加速制造业的数字…

rust持续学习 raw pointer 1

c里头 float a 1; float* p &a; 是可以直接 int * p1 (int*)p; 来强转类型做一些事情的经过了解 rust里是这么操作的 unsafe {std::mem::transmute::<origin_type, target_type>(raw_bytes) };比如上面是四个u8,可以拼一个u32 然后是函数指针这个东西 fn foo()…

Java设计模式——策略模式

1.策略模式简介 策略模式&#xff1a;策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化&#xff0c;行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得…

WindowsServer2019-搭建FTP服务器

这里写自定义目录标题 一、基础配置IP地址安装FTP服务检查连通性Windows10连接FTP服务 二、了解和使用FTP具体模块及其配置1、FTP IP地址和域限制2、FTP SSL设置3、FTP当前会话4、FTP防火墙5、FTP目录浏览6、FTP请求筛选7、FTP日志8、FTP身份验证9、FTP授权规则10、FTP消息11、…

useContext本身并不能直接向下传递方法,

useContext本身并不能直接向下传递方法&#xff0c;但可以通过将其包装在自定义 hook 中来实现。 例如&#xff0c;假设你有一个 context 叫做 MyContext&#xff0c;其中包含一个函数叫做 myFunction。你可以创建一个新的 hook 来暴露这个函数&#xff1a; jsx import { use…

云栖大会72小时沉浸式精彩回顾

计算&#xff0c;为了无法计算的价值 2023 杭州云栖大会震撼落幕 自2015年&#xff0c;云计算支撑着移动互联网创新 AI时代&#xff0c;继续支撑所有开发者的创新与梦想 当大会主题再次回归 让我们也打开时空隧道 一起回顾72小时云栖之旅 打造一朵AI时代最开放的云 随着…

C++中不允许复制的类

C中不允许复制的类 假设您需要模拟国家的政体。一个国家只能有一位总统&#xff0c;而 President 类面临如下风险&#xff1a; President ourPresident; DoSomething(ourPresident); // duplicate created in passing by value President clone; clone ourPresident; // dup…

Pinia的十个简答小案例

1. 使用Pinia进行状态管理&#xff1a; import { defineStore } from piniaexport const useCounterStore defineStore({id: counter,state: () > ({count: 0}),actions: {increment() {this.count},decrement() {this.count--}} }) 2. 在组件中使用Pinia&#xff1a; &…

力扣:151. 反转字符串中的单词(Python3)

题目&#xff1a; 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在…

【算法| 差分 No.1】AcWing 797. 差分 AcWing 798. 差分矩阵

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望对大家有所帮…

easypoi 导出Excel 使用总结

easypoi 导出Excel 导出Excel需要设置标题&#xff0c;且标题是多行&#xff0c;标题下面是列表头 设置表格标题 ExportParams headExportParams new ExportParams();StringBuilder buffer new StringBuilder("");buffer.append("1、课程名称&#xff1a;....…

DS图—图非0面积/bfs【数据结构】

DS图—图非0面积 题目描述 编程计算由"1"围成的下列图形的面积。面积计算方法是统计"1"所围成的闭合曲线中"0"点的数目。如图所示&#xff0c;在10*10的二维数组中&#xff0c;"1"围住了15个点&#xff0c;因此面积为15。 提示&…

软考 系统架构设计师系列知识点之数字孪生体(3)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之数字孪生体&#xff08;2&#xff09; 所属章节&#xff1a; 第11章. 未来信息综合技术 第5节. 数字孪生体技术概述 3. 数字孪生体的关键技术 建模、仿真和基于数据融合的数字线程是数字孪生体的三项核心技术。能够做…

基于单片机的语音存储与回放系统设计

博主主页&#xff1a;单片机辅导设计 博主简介&#xff1a;专注单片机技术领域和毕业设计项目。 主要内容&#xff1a;毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、控制系统设计1.1 系统方案设计1.2 系统工作原理 二、硬件电路设计总电路设计图 三、 软件设…

Android 应用流量监控实践

背景 得物Apm系统本身包含网络接口性能监控的能力&#xff0c;但接口监控主要关注的是接口的耗时、异常率等信息&#xff0c;没有流量消耗相关维度的统计信息&#xff0c;并且一部分流量消耗可能来自于音视频等其他特殊场景&#xff0c;在接口监控的盲区外。 为了了解用户目前…

知识注入以对抗大型语言模型(LLM)的幻觉11.6

知识注入以对抗大型语言模型&#xff08;LLM&#xff09;的幻觉 摘要1 引言2 问题设置和实验2.1 幻觉2.2 生成响应质量 3 结果和讨论3.1 幻觉3.2 生成响应质量 4 结论和未来工作 摘要 大型语言模型&#xff08;LLM&#xff09;内容生成的一个缺点是产生幻觉&#xff0c;即在输…

1.OpenResty系列之入门简介

OpenResty&#xff08;也称为ngx_openresty&#xff09;是一个基于Nginx的全功能Web应用服务器&#xff0c;它将Nginx与一组附加模块和Lua脚本语言集成在一起&#xff0c;以提供高性能的Web应用程序开发和扩展性。 Nginx是一个轻量级的、高性能的HTTP服务器和反向代理服务器&a…

Java与Redis的集成

目录 Java连接Redis 导入依赖 Redis服务器准备 建立连接 Java操作Redis常用类型数据 Redis字符串(String) Redis哈希(Hash) Redis列表&#xff08;List&#xff09; Redis集合&#xff08;Set&#xff09; Redis有序集合&#xff08;Sorted Set&#xff09; Redis在项目应用…

Go语言实现HTTP正向代理

文章目录 前言实现思路代码实现 前言 正向代理&#xff08;Forward Proxy&#xff09;是一种代理服务器的部署方式&#xff0c;它位于客户端和目标服务器之间&#xff0c;代表客户端向目标服务器发送请求。正向代理可以用来隐藏客户端的真实身份&#xff0c;以及在不同网络环境…

Bi-TTCOF-Zn助力CO2还原制CO

精确调控氧化还原单元的组分、空间取向或连接模式对于深入了解高效的人工光合整体反应至关重要&#xff0c;但对于异质结构光催化剂而言&#xff0c;还很难实现。 基于此&#xff0c;华南师范大学兰亚乾教授和陈宜法教授等人报道了一系列用于人工光合综合反应的氧化还原分子结…