松鼠的博客

导航

统计

MFC序列化

Book.h
复制代码
#include <afxwin.h>

class CBook : public CObject
{
 DECLARE_SERIAL(CBook)

 
public:
  CString m_strName;
  CString m_strAuthor;
  CString m_strPress;

 
public:
  CBook()
  
{
   
// 要使CBook对象实现序列化,必须定义默认构造函数
  }


  CBook(CString strName, CString strAuthor, CString strPress)
  
{
   m_strName 
= strName; // 书名
   m_strAuthor = strAuthor; // 作者
   m_strPress = strPress; // 出版社
  }


  
void Serialize(CArchive &); // 重载基类的Serialize函数
}
;

Book.cpp

#include 
"Book.h"

IMPLEMENT_SERIAL(CBook, CObject, 
1)

void CBook::Serialize(CArchive &ar)
{
 CObject::Serialize(ar);
 
 
if(ar.IsStoring())
 
{
  ar 
<< m_strName << m_strAuthor << m_strPress;
 }

 
else
 
{
  ar 
>> m_strName >> m_strAuthor >> m_strPress;
 }

}
复制代码

主程序
复制代码
CBook book1("Programming Windows""Charles Petzold""Microsoft Press");
CBook book2(
"Programming Windows with MFC""Jeff Prosise""Microsoft Press");
int nCount = 2;

// 序列化
CFile fileStore(_T("mybooks.dat"), CFile::modeWrite | CFile::modeCreate);
CArchive arStore(
&fileStore, CArchive::store);
CBook
* pBooksStore[2= &book1, &book2 };
arStore 
<< nCount;
for (int i=0; i<nCount; ++i)
{
 arStore 
<< pBooksStore[i];
}

fileStore.Close();

// 反序列化
CFile fileLoad(_T("mybooks.dat"), CFile::modeRead);
CArchive arLoad(
&fileLoad, CArchive::load);
arLoad 
>> nCount;
CBook
* pBooksLoad = new CBook[nCount];
for (int i=0; i<nCount; ++i)
{
 arLoad 
>> pBooksLoad[i];
}

fileLoad.Close();
复制代码

MFC序列化注意事项:
  ·要想使某一类型能被序列化,在它类型声明文件(头文件,Book.h)和类型定义文件(Book.cpp)中要分别使用DECLARE_SERIAL和IMPLEMENT_SERIAL宏。
  ·能被序列化的只能指针型,不能是值型(pBooksStore数组中包含的就是两个CBook类型的指针)。

posted on   Xproer-松鼠  阅读(478)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示