使用串行化传送对象
日期:2007年6月10日 作者: 查看:[大字体 中字体 小字体]-
串行化的原理很简单,它得到一个对象,并且将它分拆成字节流。字节流可以在网络间复制,然后可在另一端组合起来。
我们首先要解决的是通过COM接口来传送大量数据流的方法。有几种COM的数据类型可以做到这一点。如你使用一个自定义的接口,你可以使用一个普通的指针类型。使用自定义接口的问题是,需要产生一个proxy/stub DLL来在加工和分拆之间配置数据。
我更趋向于使用一个双重接口来解决这个问题,它也被称为分派或者"自动控制"接口。双重接口不但支持IDispatch的方法,也支持客户的接口。如何使用一个双重的接口呢?你可以使用类库来做所有的数据配置工作,这很方便,而且令程序的安装和管理得到简化。这样你无需要建立和安装proxy/stub DLL。你只需要传送类库就行了。
双重接口只支持有限的数据类型,其中最适合我们使用的是SAFEARRAY。这个数组可以包含一些相当复杂的多维数组,不过我们只需要使用一个简单的数组。你可以直接传送SAFEARRAY,或者将它封装到一个VARIANT中。
随后我将会简要地讨论以下使用SAFEARRAY和VARIANT。
也许你可能知道串行化怎么回事,不过下文我还是要说明一下如何使用这个方法来传送一个对象,如果你对这方面很清楚,你可以直接跳到使用CArchive那部分。 三层交换技术 交换机与路由器密码恢复 交换机的选购 路由器设置专题 路由故障处理手册 数字化校园网解决方案
使用串行化通常是为了持久地保存对象。令对象持久保存下来的一个方法是将它们写到磁盘中。一个常见的例子是在程序退出的时候,将一个SDI或者MDI应用的文档写到磁盘上。如果再次运行程序,可以重新装载这个文档,这样可继续编辑文档。
MFC通过基类CObject就可使用串行化。CObject类是MFC中最为常用的基类之一--大部分的MFC类都是继承它的。CObject类提供三个好处:
1、串行化--可将一个对象的内容读写到一个文件
2、.动态产生--可让某个类的一个对象在运行时产生
3、运行时的类信息--可让你判别一个类属于或者源于某个特定的类
4、诊断性的输出--该类提供两个诊断的方法,AssertValid()和Dump()。
当一个对象串行化自己的时候,它需要写下两类的信息。它必须写下的第一类信息是所有与它的状态有关的数据成员。通过这些特定的状态,可以重新建立一个与它串行化时的状态完全相同的对象。第二类信息是运行时的类型信息。运行时的类型信息可告诉程序重新产生该对象当时一起工作的对象类型。
通过这两类信息,一个正确配置的对象可由一个文件重新产生。为了正确地配置对象,这个对象必须拥有用来串行化它的数据的方法,并且重新由这些数据创建。
通过以下的步骤,一个MFC类可被串行化:
1、继承CObject类
2、在类的头部使用DECLARE--SERAIL宏
3、在类体使用IMPLEMENT--SERIAL宏
4、覆盖Serialize()方法来写下该类的数据
以下举个例子,为简单起见,我创建一个很简单的类,称为CSimpleObj。该类拥有一个数据成员,一个字符串。通过调用它的Show()方法,它可以显示它这个字符串。
class CSimpleObj : public CObject
{
DECLARE_SERIAL( CSimpleObj )
public:
file:// constrUCtor and destructor
CSimpleObj();
virtual ~CSimpleObj();
file:// Used to serialize data into an archive
virtual void Serialize(CArchive& ar);
file:// Display the data string
void Show( HWND hwnd );
file:// Internal data string
CString m_strData;
};
这个类最有趣的部分是它的Serialize()方法。该方法在串行处理期间被一个archive(CArchive)调用。这个archive是真正用来存储和下载对象的类。Archives在对象和它的输出文本之间起桥梁的作用。以下我们还会再来看看这个archive类,要注意Serialize的参数是用来引用CArchive类的。
IMPLEMENT_SERIAL( CSimpleObj, CObject, 1 )
...
void CSimpleObj::Serialize(CArchive& ar)
{
CObject::Serialize( ar );
if (ar.IsLoading())
{
file:// extract data from archive
ar >> m_strData;
}
else
{
file:// store data into archive
ar << m_strData;
}
}
">>"和"<<"是通过archive实现的取出和插入运算符。它们对应于CArchive类中的ReadObject()和WriteObject()方法。当archive正在下载,或者由磁盘中读取自身时,它使用">>"运算符。这样可将文件的内容下载到某个命名为m_strData的字符串中。与下载相反的是"存储"。(还有一个IsStoring()的方法。)当一个对象存储的时候,它将该字符串的内容通过"<<"运算符写到archive中。
通过Serialize方法存储和下载所有有用的数据。通常其中的一些数据成员还可以串行化自身。例如,数据成员可以是一个包含有指针指向可串行化对象的MFC COBArray。如果是的话,只要在类的Serialize方法中调用该数据类的串行化方法。
// do this at the end of the Serialize() method
m_MoreData.Serialize(ar) // serialize more data
我就曾经用过递归方法调用数千个串行化对象的类,这些类带有好几兆的数据。 - [1] [2] 下一页
-
- 使用串行化传送对象 相关文章:
- ·使用串行化传送对象
- 使用串行化传送对象 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:软件水平考试:《数据结构》是核心
下一篇:线索二叉树算法
精品推荐
热点TOP10
- ·UML业务建模实例分析
- ·GIF文件格式
- ·代码静态分析工具PC-LINT安装配置
- ·游戏外挂设计技术探讨
- ·开发WDM型的USB设备驱动程序
- ·设计模式探索系列之Bridge模式
- ·逆向思维 《魔兽世界》封包分析
- ·LZW压缩算法简介
- ·Solaris 10 安装及SVC管理及X及Vmware及其它可能遇到的一些问题
- ·1.2 什么是数据挖掘
- ·Spring让LOB数据操作变得简单易行
- ·编写QQ外挂插件的原理和方法
- ·使用BHO定制你的IE浏览器
- ·利用API在Windows下创建进程和线程
- ·在内存中修改数据的网游外挂
- ·程序语言效率比较
- ·正则表达式从入门到精通
- ·网络监听技术概览
- ·游戏开发新手入门之跟踪窗口和使用GDI
- ·原始套接字透析之实现Ping
