MFC序列化及反序列化对象

简介: MFC序列化及反序列化对象

一、序列化类对象


1、使用方法:必须满足下面四个条件


类必须派生CObject


类内必须添加声明宏  DECLARE_SERIAL


类外必须添加实现宏  IMPLEMENT_SERIAL


类必须重写CObject::Serialize虚函数


class Student :public CObject {
       //声明宏
       DECLARE_SERIAL(Student)
public:
       //构造函数
       Student(int age = 0, float score= 0.0, CString name = ""):
              m_age(age), m_score(score), m_name(name){}
       //成员变量
       int m_age;
       float m_score;
       CString m_name;
       virtual void Serialize(CArchive& ar);
};
//实现宏
IMPLEMENT_SERIAL(Student, CObject, 1)
//重写函数
void Student::Serialize(CArchive& ar) {//此函数的this为&s
       if (ar.IsLoading()) {
              ar >> m_age >> m_score >> m_name;
       }
       else {
              ar << m_age << m_score << m_name;
       }
}


2、序列化对象


利用CFile::Open 创建并打开一个硬盘文件


定义CArchive类对象  例如 :CArchive ar(..);


利用 << 实现序列化类对象到ar维护buff中


关闭CArchive类对象


关闭文件


int main() {
       CFile file;
       file.Open("e:/a.txt", CFile::modeCreate | CFile::modeWrite);
       CArchive ar(&file, CArchive::store, 4096);
       Student s(18, 888.5, "aiyou");
       ar << &s;
       ar.Close();//ar缓存区数据导在硬盘上,释放ar缓存区
       file.Close();
       return 0;
}


3、序列化类对象过程


首先将对象的类的相关信息(类名,类大小,类版本)序列化到ar维护buff中。


利用类对象调用成员虚函数Serialize,将对象的各个成员变量序列化到ar维护buff中。


当关闭ar对象时,将ar维护的buff中的剩余数据存入硬盘文件,将ar维护的buff释放。


二、反序列化对象


1、反序列化类对象


利用CFile::Open 打开一个硬盘文件


定义CArchive类对象  例如 : CArchive ar(..);


利用 >> 实现反序列化类对象。


关闭CArchive类对象


关闭文件

CFile file;
       file.Open("e:/a.txt", CFile::modeRead);
       CArchive ar(&file, CArchive::load, 4096);
       Student* pStu = NULL;
       ar >> pStu;
       printf("年龄:%d,成绩:%f,姓名:%s\n", pStu->m_age, pStu->m_score,
              pStu->m_name);
       ar.Close();
       file.Close();


2、反序列化类对象过程


首先将类的相关信息(类名等)反序列化到ar维护buff中


利用类名找到动态创建机制的静态变量。


利用静态变量调用加工厂函数,动态创建类对


利用对象调用成员虚函数Serialize,将“年龄等”信息,保存到对象        各个成员变量中。


将动态创建的对象的地址赋值给我们定义空指针(pStu)。


目录
相关文章
|
1天前
|
JSON Java Linux
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
17 2
|
3天前
|
XML 存储 JSON
[计算机网络]---序列化和反序列化
[计算机网络]---序列化和反序列化
|
10天前
|
存储 JSON PHP
python序列化与反序列化
python序列化与反序列化
|
12天前
|
存储 Java 测试技术
滚雪球学Java(22):序列化和反序列化
【4月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
29 1
滚雪球学Java(22):序列化和反序列化
|
15天前
|
SQL 存储 安全
每日一道面试题:Java中序列化与反序列化
每日一道面试题:Java中序列化与反序列化
10 0
|
2月前
|
存储 XML JSON
数据传输的艺术:深入探讨序列化与反序列化
数据传输的艺术:深入探讨序列化与反序列化
57 0
|
2月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
2月前
|
存储 Java 数据库
|
1月前
|
JSON 安全 Java
Spring Boot 序列化、反序列化
本文介绍了Spring Boot中的序列化和反序列化。Java提供默认序列化机制,通过实现Serializable接口实现对象到字节流的转换。Spring Boot默认使用Jackson处理JSON,可通过注解和配置自定义规则。然而,序列化可能引发安全问题,建议使用白名单、数据校验和安全库。最佳实践包括使用标准机制、自定义规则及注意版本控制。文章还提醒关注性能并提供了相关参考资料。
44 2
|
25天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
28 5