zoukankan      html  css  js  c++  java
  • 数据串行化

    利用CArchive类实现数据串行化,

    需要注意的是,

    串行化的对象一定要是从CObject类派生出来的,

    同时,

    要在被串行化的对象的类的头文件中进行宏定义

    //文件串行化宏定义
     DECLARE_SERIAL(CMyBox)

    还要在被串行化的对象的类的实现文件中进行宏定义

    //对象串行化宏定义
    IMPLEMENT_SERIAL(CMyBox,CObject,0);

    然后对虚函数void 类名::Serialize(CArchive& ar)进行重载,

    添加相应的串行化代码和读取串行化文件代码,

    再在需要执行串行化的位置添加代码

     CFile file;
     file.Open(_T("1.dat"), CFile::modeWrite| CFile::modeCreate  );
     CArchive ar(&file, CArchive::store );  //CArchive::load);
     CString mycstr(_T("AAA"));
     ar<<mycstr;
     ar.Flush();
     ar.Close();
     file.Close();

    即可实现对象的串行化。

    同时,可以通过调用函数CObject::IsSerializable 来判断该类是否可被串行化。

    在读取被串行化的文件时,

    可用如下方法:

    CFile myFile(TempName+_T(".dat"), CFile::modeRead);

     // Create a loading archive.
     myFile.SeekToBegin();
     CArchive arLoad(&myFile, CArchive::load);

     // Verify the object is in the archive.
     pBox = (CMyBox*) arLoad.ReadObject(RUNTIME_CLASS(CMyBox));

    特别要注意的是,

    如果被串行化的对象中存在向量,

    要使用如下方法:

    void Initialization::Serialize(CArchive& ar)
    {
     if (ar.IsStoring())
     { // storing code
      ar<<num;

      for(int i=0; i<num; i++)
       ar<<item[i];

      for(int i=0; i<num; i++)
       ar<<level[i];
     }
     else
     { // loading code
      ar>>num;
      CString str;
      int m_int;
      
      for(int j=0; j<num; j++)
      {
       ar>>str;
       item.push_back(str);
      }

      
      for(int k=0; k<num; k++)
      {
       ar>>m_int;
       level.push_back(m_int);
      }
     }
    }

    其中num为向量中元素的个数,

    应该与向量同时存放在文件中,

    并优先读取num。

  • 相关阅读:
    Weex-语法笔记 一
    Entitlements (授权机制) 延伸
    FOUNDATION_EXPORT 延伸
    NS_ASSUME_NONNULL_BEGIN 延伸
    SSLPinning 延伸
    Socket.io 延伸
    UI_APPEARANCE_SELECTOR 延伸
    Modules和Autolinking
    代码块(Block)回调一般阐述
    数据库连接池配置错误导致OOM
  • 原文地址:https://www.cnblogs.com/johnpher/p/2570705.html
Copyright © 2011-2022 走看看