網站首頁 編程語言 正文
序列化是將程序中的對象以一種二進制格式存儲到存儲設備中(例如文本/數據庫等),以實現“永生”或隨意“流動”
首先定義一個要序列化的類people,其屬性有age、weight、height。
#pragma once
class people {
public:
int age;
int weight;
int height;
};
定義好后將該類添加到 ?項目名view.h ?的類中,作為其屬性,并且是指針類型
將需要存取的類實現序列化?
1.序列化的類必須從CObject派生,或是從CObject的派生類派生
#pragma once
//導入#include<afx.h>頭文件,使類能繼承CObject
#include<afx.h>
class people :public CObject {
public:
int age;
int weight;
int height;
};
2.為該類定義一個不帶參數的構造函數
3.在類聲明中使用DECLARE_SERIAL(類名)宏
#pragma once
#include<afx.h>
class people :public CObject {
public:
DECLARE_SERIAL(people);
people();
public:
int age;
int weight;
int height;
};
4.在類的實現中添加IMPLEMENT_SERIAL(類名,父類名,版本號)宏?
#include "pch.h"
#include "people.h"
//第一個參數是類的名字,第二個參數是父類名字,第三個參數是版本號(一般版本號從1開始)
IMPLEMENT_SERIAL(people, CObject, 1);
people::people()
{
}
5.在類的實現中,通過類向導添加Serialize虛函數(也可也手寫)
MFC提供了CArchive類可以將對象數據保存到永久設備,比如磁盤文件。當應用程序重新啟動后,CArchive類可以幫助我們從磁盤文件讀取這些數據,然后在內存中重新構建對應的對象;這樣就使得我們的對象數據永久存在,該過程稱之為序列化(或者串行化)。?
void people::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
}
else
{ // loading code
}
}
CArchive類重載了輸入輸出運算符,在存取時就是利用運算符重載
void people::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
//存數據
ar << age << weight << height;
}
else
{ // loading code
//讀數據
ar >> age >> weight >> height;
}
}
如果說類的屬性中有自定義類型的數組,比如下面這種,其中CPoint是MFC類型對象
#pragma once
#include<afx.h>
class people :public CObject {
public:
CArray<CPoint>m_point;
};
那么在 Serialize設置存取時可以安這樣
void people::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
//存數據
ar << age << weight << height;
}
else
{ // loading code
//讀數據
ar >> age >> weight >> height;
}
/*直接使用數組調用該方法,因為數組已經實現了這個方法,數組存放的元素是CPoint,CPoint
本省也是支持序列化*/
m_point.Serialize(ar);
}
在程序啟動時加載序列化
在Doc.cpp文件中找到序列化接口函數
void Cdraw3Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存儲代碼
}
else
{
// TODO: 在此添加加載代碼
}
}
從view類里拿到要序列化的數據people*
void Cdraw3Doc::Serialize(CArchive& ar)
{
//取出第一個view在鏈表中的位置
POSITION pos = GetFirstViewPosition();
//通過位置獲得該view
Cdraw3View* pView = (Cdraw3View* )GetNextView(pos);
if (ar.IsStoring())
{
//存數據
ar << pView->human;
}
else
{
//取數據
ar >> pView->human;
}
}
這樣我們每次保存時數據就可以以二進制序列化保存,每次打開時又可以打開上次保存的內容 ?
如果people*是一個數組的話,例如這樣
那么我們在用序列化存取時就要先存取數組長度,再循環存取數組的內容?
void Cdraw3Doc::Serialize(CArchive& ar)
{
//取出第一個view在鏈表中的位置
POSITION pos = GetFirstViewPosition();
//通過位置獲得該view
Cdraw3View* pView = (Cdraw3View* )GetNextView(pos);
//獲得數組長度
int cnt = pView->human.GetSize();
if (ar.IsStoring())
{
//存數據
ar << cnt;
for (int i = 0; i < cnt; i++) {
//循環存儲數組
ar << pView->human.GetAt(i);
}
}
else
{
//取長度
ar >> cnt;
for (int i = 0; i < cnt; ++i) {
//依次取數據,加入到數組中
people* p;
ar >> p;
pView->human.Add(p);
}
}
}
原文鏈接:https://blog.csdn.net/qq_54169998/article/details/125676225
相關推薦
- 2022-07-23 詳解Nginx的超時keeplive_timeout配置步驟_nginx
- 2022-11-17 Kotlin?StateFlow單數據更新熱流設計與使用介紹_Android
- 2022-09-27 React?函數式組件和類式組件詳情_React
- 2022-04-25 C#實現簡單串口通信_C#教程
- 2022-09-30 C++實戰之二進制數據處理與封裝_C 語言
- 2022-05-20 如何保證緩存和數據庫的一致性?
- 2022-05-13 error hawk@0.10.2: The engine “node“ is incompatib
- 2022-10-21 C++可調用對象callable?object深入分析_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支