对象存储的几种方法

2023-10-29

我们有时候会有这样的需求场景,需要将一个对象以二进制形式保存在文件或者字符流中,以便下一次加载时可以直接从二进制文件或者流中直接读取对象,并对对象进行操作。

对象存储的目的,本质是要存储对象中各个成员的数据。因此我们从两个角度来思考这个问题。
1、对象在实例化后,会为其分配一片内存空间,在这片内存空间上会记录各个成员变量的值。因此,我们会首先想到直接进行内存拷贝,保存对象的二进制数据。
2、序列化的方式分别保存对象中各个成员变量的值,并在反序列化的过程中对对象的各个成员变量分别赋值。

下面记录简单的演示方法:

#include <QCoreApplication>
#include <QDataStream>
#include <QTextStream>
#include <QFile>
#include <QDebug>
#include <iostream>
#include <fstream>
#include <sstream>
#include <QDataStream>

using namespace std;

class BinData
{
public:
    BinData(){}
    BinData(QString name,int age):m_name(name),m_age(age) {}
    QString name(){ return m_name;}
    int age(){ return m_age;}
public:
    QString m_name;
    int m_age;
};


QDataStream& operator <<(QDataStream& s,const BinData& that)
{
    s << that.m_name << that.m_age;
    return s;
}

void operator >> (QDataStream& s,BinData& that)
{
    s >> that.m_name >> that.m_age;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    BinData dt(QStringLiteral("张山"),20);

    /// [1] ------------------------------------
    /// 将对象以二进制形式保存到文件
    ofstream ofs("binObject",std::ios::binary);
    ofs.write((char*)&dt,sizeof(dt));
    ofs.close();

    /// 从二进制文件中反序列化对象
    BinData rdt;
    ifstream ifs("binObject",std::ios::binary);
    ifs.read((char*)&rdt,sizeof(rdt));
    ifs.close();

    qDebug() << rdt.name() << rdt.age() << Qt::endl;

    ///  [2] ------------------------------------
    /// 将对象序列化为二进制字符串
    stringstream s(std::ios::in | std::ios::binary);
    s.read((char*)&dt,sizeof(dt));

    ///  从stringstream中读取BinData对象
    BinData srdt;
    s.write((char*)&srdt,sizeof(rdt));
    qDebug() << rdt.name() << rdt.age() << Qt::endl;


    ///  [3] ------------------------------------
    /// 使用QDataStream 实现的序列化
    QFile qf("qbinObject");
    qf.open(QIODevice::WriteOnly);
    QDataStream qds(&qf);
    qds << dt;
    qf.close();

    /// 使用QDataStream 实现的反序列化
    BinData qrdt;
    qf.open(QIODevice::ReadOnly);
    QDataStream qrds(&qf);
    qrds >> qrdt;
    qf.close();
    qDebug() << qrdt.name() << qrdt.age() << Qt::endl;


    return a.exec();
}

输出结果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象存储的几种方法 的相关文章

随机推荐

  • VS2017社区版Community 许可证过期解决方法

    之前过期可以登录自己的github账号再认证一下就OK了 但是这次就是登录不上会有脚本错误的弹窗 搜到一个方法亲测有效 也非常简单 找一个同等开发环境 把对应路径下的许可证文件夹拷贝放到自己的文件夹下即可 感谢各位大佬愿意分享
  • AD学习笔记(二)——PCB布局布线

    PCB布局布线 1 先确定板子的大小 用Keep out层或机械层确定边框 2 布线 走线连接需为钝角 不能出现直角 锐角 布局时要考虑走线的难易 线长 走线要尽量短 和可能出现的绕线情况 顶层和底层线大规律要十字交叉 走线与边框距离大于1
  • 如何通过开发机连接远程机器开发(端口转发)

    MobaXterm方式 可以解决公司需要要用跳板机连接远程机器的问题 打开mobaxterm gt tools gt MobaSSHtunnel 就进入以下界面 Forward Port 写本地没有被用过的端口 这里用的是10023 SSH
  • 【Git系列】了解什么是版本控制

    了解什么是版本控制 1 什么是版本控制 2 为什么要有版本控制 3 常见的版本控制工具 4 版本控制分类 4 1 本地版本控制 4 2 集中版本控制 4 3 分布式版本控制 其他系列 Git最详细的体系化教程 学习git之前 我们需要先明白
  • 找出1000以内所有素数

    今天和大家分享一个打印1000以内所有素数的程序 这是我第一次在平台上分享我写的代码 希望对一些像我一样的初学者有点帮助 include
  • 计算机论文参考文献最新年份,参考文献时间格式

    参考文献时间格式 论文的参考文献是在学术研究过程中 对某一著作或论文的整体的参考或借鉴 本篇是小编为大家收集整理的参考文献时间格式 喜欢的朋友不要错过啦 参考文献时间格式 1 期刊 序号 主要作者 文献题名 J 刊名 出版年份 卷号 期号
  • 计算机网络——绪论

    6个章节 外加实验和复习课时 题目来自于题库 重在理解 翻译 概述 物理层 链路层 网络层 传输层 应用层 复习课 实验课 一 计算机网络的基本概念 21 世纪的一些重要特征就是 数字化 网络化 和 信息化 是一个以网络为核心的信息时代 网
  • centos7下面php5.6添加postgresql相关扩展【试行】

    下载相关资源 首先 请下载PDO PGSQL及pq两个扩展包源码 PDO PGSQL pq 我下的是 请上传到centos服务器 上传完毕 解压及编译 解压后 分别编译扩展 编译pq扩展 步骤如下 注意 使用phpize的时候需要到扩展根目
  • void 可以避免编译警告

    下面这个函数被声明返回一个int类型 static int hns nic net stop struct net device ndev hns nic net down ndev return 0 如果在调用的时候不关心这个返回值的话
  • Linux 内核将用 Nftables 替代 iptables

    新的防火墙子系统 包过滤引擎 Nftables 将在 Linux 3 13 中替代有十多年历史的iptables iptables netfilter在2001年加入到2 4内核中 诞生于2008年的 NFTables 设计替代 iptab
  • Linux高级命令02 查看文件内容命令、链接命令

    Python Web篇学习汇总 Part 01 Linux基础命令 操作系统与虚拟机软件 了解Ubuntu操作系统 Linux查看 切换目录命令 绝对路径和相对路径 创建 删除 复制 移动文件及目录命令 ls命令选项 mkdir和rm命令选
  • SpringBoot入门了解

    第 1 章 Spring Boot入门 1 简介 简化Spring应用开发的一个框架 整个Spring技术栈的一个大整合 J2EE开发的一站式解决方案 2 微服务 微服务 架构风格 服务微化 一个应用应该是一组小型服务 各司其职 那么对于负
  • edge浏览器证书错误NET::ERR_CERT_AUTHORITY_INVALID

    解决方案 使用fiddler后edge浏览器频繁证书报错 重置浏览器设置后正常
  • java根据word模板导出word文件

    1 word模板文件处理 如下图所示在word 文档中填值的地方写入占位变量 2 将word文档另存为xml文件 编辑如下图 找到填写的占位 修改为 bcrxm 格式 3 将文件后缀名改为 ftl文件 4 java处理过程 引入frameM
  • eigen 矩阵求逆_C++学习笔记——6. Eigen入门(矩阵运算及几何模块)

    本文介绍了C 中Eigen库的代数运算模块和几何模块 以程序实例演示了常见指令用法 Eigen是一个高层次开源C 库 有效支持线性代数 矩阵和矢量运算 数值分析及其相关算法 在SLAM或者VIO研究中 对Eigen库的使用可以说非常多 因此
  • opencv使用(一):安装 -- 基于python3.7

    目录 pip安装 源码安装 测试 pip安装 打开命令行工具cmd 直接安装 安装成功即可获得最新版opencv python pip install opencv python 也可以指定版本 例如 pip install opencv
  • 服务器Linux系统安装 制作CentOS 7.6 U盘启动

    第一步 准备工作 1 8G以上U盘 2 UltraISO虚拟光驱 试用即可 破解的话自行找一下教程或者激活码 下载地址 https cn ultraiso net xiazai html 3 CentOS 7 6 镜像 这里推荐1810或者
  • qt中路径使用的小结

    QCoreApplication applicationDirPath 帮助文档中的解释 返回包含应用程序可执行文件的目录 例如 如果您在C Qt目录下安装了Qt 并且运行regexp示例 该函数将返回 C Qt examples tool
  • C#中的时间戳

    来源 https blog guoqianfan com 2019 11 24 timestamp in csharp 什么是时间戳 时间戳默认是Unix时间戳 首先要清楚JavaScript与Unix的时间戳的区别 JavaScript时
  • 对象存储的几种方法

    我们有时候会有这样的需求场景 需要将一个对象以二进制形式保存在文件或者字符流中 以便下一次加载时可以直接从二进制文件或者流中直接读取对象 并对对象进行操作 对象存储的目的 本质是要存储对象中各个成员的数据 因此我们从两个角度来思考这个问题