可重入的对象序列化

来源:互联网 发布:大学生时间管理矩阵 编辑:程序博客网 时间: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时就载入上次保存的内容就可以了,这样实现起来就很方便了.

        上述的关键是在于对象的序列化要可重入的,所以在写 序列化函数时就要注意它的可重入了.

 

原创粉丝点击