subject_20890.htm

来自「一些关于vc的问答」· HTM 代码 · 共 18 行

HTM
18
字号
<p>
序号:20890 发表者:bborn 发表日期:2002-11-11 21:25:38
<br>主题:谁能帮忙解释一下 什么是序列化?
<br>内容:CArchive类 主要是干什么用的?<BR>用在什么地方 <BR>有什么意义?<BR><BR>有的书上翻译成 序列化 有的翻译成串行化和并行化<BR>有什么意思 到底??
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:小年 回复日期:2002-11-11 21:40:50
<br>内容:就是将对象永久存储,包括对象实时的属性等数据,可以使数据存放的透明化,你只须ar&lt;&lt;obj;ar&gt;&gt;obj;就可以实现文件的存储和读取功能
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:雷神 回复日期:2002-11-12 03:41:33
<br>内容:闻老大写过<BR><BR>利用序列化进行文件读写<BR>闻怡洋&nbsp;&nbsp;<BR>01-9-11 上午 10:10:24<BR><BR>--------------------------------------------------------------------------------<BR> <BR><BR>在很多应用中我们需要对数据进行保存,或是从介质上读取数据,这就涉及到文件的操作。我们可以利用各种文件存取方法完成这些工作,但MFC中也提供了一种读写文件的简单方法——“序列化”。序列化机制通过更高层次的接口功能向开发者提供了更利于使用和透明于字节流的文件操纵方法,举一个例来讲你可以将一个字串写入文件而不需要理会具体长度,读出时也是一样。你甚至可以对字符串数组进行操作。在MFC提供的可自动分配内存的类的支持下你可以更轻松的读/写数据。你也可以根据需要编写你自己的具有序列化功能的类。 <BR> <BR>序列化在最低的层次上应该被需要序列化的类支持,也就是说如果你需要对一个类进行序列化,那么这个类必须支持序列化。当通过序列化进行文件读写时你只需要该类的序列化函数就可以了。 <BR> <BR>怎样使类具有序列化功能呢?你需要以下的工作:&nbsp;&nbsp;<BR> <BR>● 该类从CObject派生。&nbsp;&nbsp;<BR>● 在类声明中包括DECLARE_SERIAL宏定义。&nbsp;&nbsp;<BR>● 提供一个缺省的构造函数。&nbsp;&nbsp;<BR>● 在类中实现Serialze函数&nbsp;&nbsp;<BR>● 使用IMPLEMENT_SERIAL指明类名和版本号&nbsp;&nbsp;<BR> <BR>下面的代码建立了一个简单身份证记录的类,同时也能够支持序列化。&nbsp;&nbsp;<BR> <BR>in H <BR>struct strPID <BR>{ <BR>char szName[10]; <BR>char szID[16]; <BR>struct strPID* pNext; <BR>}; <BR>class CAllPID : public CObject <BR>{ <BR>public: <BR>DECLARE_SERIAL(CAllPID) <BR>CAllPID(); <BR>~CAllPID(); <BR> <BR>public:// 序列化相关&nbsp;&nbsp;<BR>struct strPID* pHead; <BR>//其他的成员函数 <BR>void Serialize(CArchive& ar); <BR>}; <BR> <BR>in CPP <BR>IMPLEMENT_SERIAL(CAllPID,CObject,1) // version is 1,版本用于读数据时的检测 <BR>void CAllPID::Serialize(CArchive& ar) <BR>{ <BR>int iTotal; <BR>if(ar.IsStoring()) <BR>{//保存数据 <BR>iTotal=GetTotalID();//得到链表中的记录数量 <BR>arr&lt;&gt;iTotal; <BR>for(int i=0;i&gt;*(((BYTE*)pID)+j);//读一个strPID中所有的数据 <BR>//修改链表 <BR>} <BR>} <BR>} <BR> <BR>当然上面的代码很不完整,但已经可以说明问题。这样CAllPID就是一个可以支持序列化的类,并且可以根据记录的数量动态分配内存。在序列化中我们使用了CArchive类,该类用于在序列化时提供读写支持,它重载了&lt;&lt;和&gt;&gt;运算符号,并且提供Read和Write函数对数据进行读写。&nbsp;&nbsp;<BR> <BR>下面看看如何在文档中使用序列化功能,你只需要修改文档类的Serialize(CArchive& ar)函数,并调用各个进行序列化的类的Serial进行数据读写就可以了。当然你也可以在文档类的内部进行数据读写,下面的代码利用序列化功能读写数据: <BR> <BR>class CYourDoc : public CDocument <BR>{ <BR>void Serialize(CArchive& ar); <BR>CString m_szDesc; <BR>CAllPID m_allPID; <BR>...... <BR>} <BR> <BR>void CYourDoc::Serialize(CArchive& ar) <BR>{ <BR>if (ar.IsStoring()) <BR>{//由于CString对CArchive定义了&lt;&lt;和&gt;&gt;操作符号,所以可以直接利用&gt;&gt;和&lt;&lt; <BR>ar&lt;&gt;m_szDesc; <BR>} <BR>m_allPID.Serialize(ar);//调用数据类的序列化函数 <BR>} <BR> <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?