MFC 之支持串行化的类

MFC中可以串行化的类必须满足以下条件

1 从CObject派生,或者间接派生

2 重写Serialize函数

3 使用DECLARE_SERIAL宏

4 定义不带参数的构造函数

5 在类的实现文件中用IMPLENT_SERIAL宏

在绘图保存的程序中,类CPaints作为保存的基本单元,它里面存储了绘图类型,起始点,终止点三个成员变量。

然后在绘图中每当绘制一幅图都会将CPaints作为保存对象,保存在View类的CObArray类型的变量中。

在文件保存中需要在Document类中保存View类中的m_obArray,加载的时候反之。

主要代码如下所示:

//Paints.h
#pragma once

// CPaints 命令目标

class CPaints : public CObject
{
public:
	CPaints();
	virtual ~CPaints();
	CPaints(UINT type,CPoint start,CPoint end);
	void Serialize(CArchive& ar);
	void Draw(CDC* pDC);
private:
	UINT m_nDrawType;
	CPoint m_ptOrigin;
	CPoint m_ptEnd;

	DECLARE_SERIAL(CPaints)
};

.............................................................................................................

//Paints.cpp
// Paints.cpp : 实现文件
//

#include "stdafx.h"
#include "mfcArchive.h"
#include "Paints.h"

IMPLEMENT_SERIAL(CPaints,CObject,1)
// CPaints

CPaints::CPaints()
{
	m_nDrawType = 0;
}

CPaints::~CPaints()
{
}

// CPaints 成员函数
CPaints::CPaints(UINT type,CPoint start,CPoint end)
{
	m_nDrawType = type;
	m_ptOrigin = start;
	m_ptEnd = end;
}

void CPaints::Serialize(CArchive& ar)
{
	if(ar.IsStoring() )
	{
		ar<<m_nDrawType<<m_ptOrigin<<m_ptEnd;
	}
	else
	{
		ar>>m_nDrawType>>m_ptOrigin>>m_ptEnd;
	}
}

void CPaints::Draw(CDC* pDC)
{
	CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
	CBrush *pOldBrush = pDC->SelectObject(pBrush);
	switch(m_nDrawType)
	{
	case 1:
		pDC->SetPixel(m_ptEnd,RGB(0,0,0));
		break;
	case 2:
		pDC->MoveTo(m_ptOrigin);
		pDC->LineTo(m_ptEnd);
		break;
	case 3:
		pDC->Rectangle(CRect(m_ptOrigin,m_ptEnd));
		break;
	case 4:
		pDC->Ellipse(CRect(m_ptOrigin,m_ptEnd));
		break;
	}
	pDC->SelectObject(pOldBrush);
}

......................................................................................................

void CmfcArchiveDoc::Serialize(CArchive& ar)
{
	POSITION ps = GetFirstViewPosition();
	CmfcArchiveView* pView = (CmfcArchiveView*)GetNextView(ps);
	if (ar.IsStoring())
	{
		// TODO: 在此添加存储代码
		int a = 5;
		char b = 'c';
		CString str("load test");
		ar<<a<<b<<str;

		//
		int nCount = pView->m_obArray.GetSize();
		ar<<nCount;
		for(int i=0;i<nCount;i++)
		{
			ar<<pView->m_obArray.GetAt(i);
		}
	}
	else
	{
		// TODO: 在此添加加载代码
		int a;
		char b;
		CString str,strResult;
		ar>>a>>b>>str;
		strResult.Format("%d,%c,%s",a,b,str);
		//AfxMessageBox(strResult);
		int nCount;
		CPaints *ps;
		ar>>nCount;
		for(int i=0;i<nCount;i++)
		{
			ar>>ps;
			pView->m_obArray.Add(ps);
		}
	}
}

............................................................................

void CmfcArchiveView::OnDraw(CDC* pDC)
{
	CmfcArchiveDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	int nCount;
	nCount = m_obArray.GetSize();
	for(int i=0;i<nCount;i++)
	{
		( (CPaints*)m_obArray.GetAt(i) )->Draw(pDC);
	}
}

MFC 之支持串行化的类,布布扣,bubuko.com

时间: 2024-11-03 21:06:34

MFC 之支持串行化的类的相关文章

在MFC中将类串行化存储

.h文件如下: #pragma once class CMyData : public CObject { public: CPoint pt; int  m_iData; public: DECLARE_SERIAL(CMyData) CMyData(){} CMyData(int nData, CPoint pt1) { m_iData = nData; pt = pt1; } virtual void Serialize(CArchive& ar); }; .cpp文件内容如下: #inc

MFC 文件I/O和串行化

1.枚举所有文件夹(递归) void EnumerateFolders () { WIN32_FIND_DATA fd; HANDLE hFind = ::FindFirstFile (_T ("*.*"), &fd); if (hFind != INVALID_HANDLE_VALUE) { do { if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { CString name = fd.cFileName; i

对象的串行化

一.串行化的概念和目的 1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果交量是另一对象的引用,则引用的对象也要串行化.这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括

JavaEE 对象的串行化(Serialization)

什么情况下需要序列化 a)当你想把的内存中的对象写入到硬盘的时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候:再稍微解释一下:a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存.在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口:b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象

数据库管理(事务、ACID、并发、封锁、可串行化、隔离)(转)

1.数据库事务 1.1 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作. 1.2 事务的4个特性(ACID): (1)原子性(atomic)(atomicity)事务必须是原子工作单元:对于其数据修改,要么全都执行,要么全都不执行.通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的.原子性消除了系统处理操作子集的可能性. (2)一致性(consistent)(consistency)事务在完成时,必须使所有的数据都保持一致状态.事务结束

java串行化

一.串行化的概念和目的 1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力,叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果变量是另一对象的引用,则引用的对象也要串行化.这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括

PostgreSQL串行化隔离级别(SSI)的能力与实现

https://zhuanlan.zhihu.com/p/37087894 PostgreSQL9.1是第一个采用Serializable Snapshot Isolation(SSI)实现串行化隔离级别的生产级数据库. 本文的目标是学习与分析SSI的设计思路,以及在PG中的实现与优化.首先介绍了隔离级别以及实现其的两个基本并发控制机制,给出了PG的SI未达到串行化的案例,分析原因并给出直观的解决思路,其次阐述了SSI的技术思路与关键环节,最后就PG内核中SSI的实现与优化思路进行了分析. 1.

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

对象的序列化(串行化)分析(一)

对象的序列化(串行化)序列化概念:(1)对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下 来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状 态的数值来记录自己 ,这个过程叫对象的串行化(Serialization-连续) .(2)一个对象随着创建而存在,随着程序结束而结束.那 如果我要保存一个对象的状态呢?Java序列化能够将对象的状态写入byte流存储起来,也从其他