可重入的对象序列化
来源:互联网 发布:大学生时间管理矩阵 编辑:程序博客网 时间:2024/05/17 00:53
什么是可重入的对象序列化? 就是说对象任意时候都可以进行序列化,包括保存和载入,而且不会影响当前程序运行和对象状态的异常.例如下面的例子:
class Test
{
public:
CStringArray m_strAry;
void Serialize( CArchive &ar )
{
int count ;
if( ar.IsStoring())
{
count = m_strAry.GetCount();
ar << count ;
for( int i=0; < count ; i++) ar << m_strAry[i] ;
}
else
{
CString str ;
ar >> count ;
for( int i=0; i < count ; i++){ ar >> str ; m_strAry.Add(str);}
}
}
};
这个对象的序列化就是不可重入的.因为在载入时,如果m_strAry本来就有数据的话,那载入时m_strAry就会把保存的字符串添加在数组的后面.所以可以在载入前把 m_strAry 清空,即如下:
void Serialize( CArchive &ar )
{
int count ;
if( ar.IsStoring())
{
count = m_strAry.GetCount();
ar << count ;
for( int i=0; < count ; i++) ar << m_strAry[i] ;
}
else
{
m_strAry.RemoveAll();
CString str ;
ar >> count ;
for( int i=0; i < count ; i++){ ar >> str ; m_strAry.Add(str);}
}
}
可重入的对象序列化有什么作用呢? 在对象的复制, Undo , Redo 时就很方便了. 例如复制时:
void Copy( CObject *a , CObject *b)
{
CMemFile mfile;
{
CArchive ar( &mfile , CArchive::Mode::load );
a->Serialize(ar); // save
}
{
mfile.SeekBegin();
CArchive ar( &mfile , CArchive::Mode::store);
b->Serialize(ar); // copy
}
}
做Undo , Redo也很简单,只在对象改变时就保存序列化的内容,在Undo时就载入上次保存的内容就可以了,这样实现起来就很方便了.
上述的关键是在于对象的序列化要可重入的,所以在写 序列化函数时就要注意它的可重入了.
- 可重入的对象序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化!
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- 对象的序列化
- Using GCC’s C++ Compiler
- linux下一个好玩的自解压脚本
- 使用CryptoAPI解析X509证书和P12证书
- Kitl是怎样工作的?
- Hibernate二级缓存
- 可重入的对象序列化
- as 运算符(FLEX)
- eclipse中jbpm的插件jpdl安装
- ASP.net
- can not be found.please check the location and try again
- tomcat环境变量配置与ant环境变量配置
- Oracle中序列sequence 用法
- linq基本运用
- 数据类型说明(FLEX)