导出类的串行化

原创 2006年06月12日 22:09:00
导出类的串行化
众所周知,要对类的实例化对象进行串行化操作就需要使这个类能够进行类型识别操作、动态创建操作和串行化操作。即需要包含下面这两个宏:
DECLARE_SERIAL(CMyClass)
IMPLEMENT_SERIAL(CMyClass,CObject,sc_no)
但作为导出类,光具备这两个条件还不够,这里因为:
1)在从文件中读出类对象时,需要调用CRuntimeClass::Load(CArchive& ar, UINT* pwSchemaNum)函数。函数体如下:
……………………
       // search app specific classes
       AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
       AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
       for (pClass = pModuleState->m_classList; pClass != NULL;
              pClass = pClass->m_pNextClass)
       {
              if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0)
              {
                     AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
                     return pClass;
              }
       }
       AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
#ifdef _AFXDLL
       // search classes in shared DLLs
       AfxLockGlobals(CRIT_DYNLINKLIST);
       for (CDynLinkLibrary* pDLL = pModuleState->m_libraryList; pDLL != NULL;
              pDLL = pDLL->m_pNextDLL)
       {
              for (pClass = pDLL->m_classList; pClass != NULL;
                     pClass = pClass->m_pNextClass)
              {
                     if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0)
                     {
                            AfxUnlockGlobals(CRIT_DYNLINKLIST);
                            return pClass;
                     }
              }
       }
       AfxUnlockGlobals(CRIT_DYNLINKLIST);
#endif
 
       TRACE1("Warning: Cannot load %hs from archive. Class not defined./n",
              szClassName);
………………………………
Load()函数的功能就是得到应用程序本身已经注册的类,并与当前文件中的类类型相比较,创建新的指定类型对象。这里的代码分为两部分:第一部分是从应用程序本身的注册类中进行查找,如果没有找到,则从注册的外部类(由动态链接库中导出的类)。如果还是没有找到,则返回NULL,提示“非预期的文件格式”。
2)如果使用正常的MFC动态链接库,则导出类不会注册到应用程序的AFX_MODULE_STATE结构体中,也就是在应用程序初始化时动态链接库时不会初始化该动态链接库,,通过// search classes in shared DLLs也不会找到该类从而产生错误。因此,在此需要使用扩展的动态链接库,调用DLLMain()函数进行动态链接库的初始化操作。这样,程序才会正常进行串行化操作。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

MFC如何生成一个可串行化的类

一、MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程。 (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或...

使用MFC的CFile文件类和CArchive串行化类进行二进制文件读写操作

一  编程案例介绍    本案例基于控制台工程,创建专门的演示类CDemo,实现二进制文件的读写串行化操作,具体代码如下: 1 CDemo类定义: class CDemo  { public...

QDataStream类提供了二进制数据到QIODevice的串行化

QDataStream类提供了二进制数据到QIODevice的串行化。 #include 所有成员函数的列表。 公有成员 QDataStream () QData...

MFC如何生成一个可串行化的类

一、MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程。 (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或...

VC:使新的类支持串行化

STEP1:修改该类,从CObject 继承 class CGraph:public CObject STEP2:实现void CGraph::Serialize(CArchive& ar)函数 ...

mfc 序列化类(串行化类)的继承和虚函数应用

网上搜索到的关于mfc类的序列化几乎都是直接派生自CObject而没有间接的,所以根据: 第四版16.1.2节讲到,可序列化类必须直接或间接地从CObject派生而来,并且在类声明中,必须包含DEC...

孙鑫VC学习(第13课--文档与串行化)

先建立一个MFC的单文档程序。在框架上增加两个按钮,文件操作下面的读取文件和写入文件。并且在视类中增加消息响应函数。下面用CArchive类对文件进行操作。使对象持久性。将CArchive类保存在持久...

MFC串行化数据测试例程

  • 2013-12-28 21:24
  • 4.91MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)