Skip to main content
Email Password   helpLost your password?

This article is the first of a 3 part tutorial on serialization.


Serialization is the process of writing or reading an object to or from a persistent storage medium, such as a disk file. Serializing an object requires 3 ingredients:

Serialization data flow

Step 1 - Open the datafile

To serialize an object to the file "foo.dat", open the file with the appropriate access mode. In this example, the file is opened for exclusive read/write access.
  // Open file "foo.dat"
  CFile* pFile = new CFile();
  ASSERT (pFile != NULL);
  if (!pFile->Open ("foo.dat", CFile::modeReadWrite | CFile::shareExclusive)) {
      // Handle error
      return;
  }

Step 2 - Hook up the archive

Next, a CArchive object is hooked up to the file. The archive provides an efficient conduit to persistent storage. Instead of directly reading and writing the file, you serialize data to and from the archive. The archive needs to know if you're going to be using it to read or write data. In this example, we'll assume we're writing data.
  // Create archive ...
  bool bReading = false;  // ... for writing
  CArchive* pArchive = NULL;
  try
  {
    pFile->SeekToBegin();
    UINT uMode = (bReading ? CArchive::load : CArchive::store);
    pArchive = new CArchive (pFile, uMode);
    ASSERT (pArchive != NULL);
  }
  catch (CException* pException)
  {
    // Handle error
    return;
  }

Step 3 - Serialize the object

Finally, we serialize the object by calling its serialize() method. serialize() is just a method we made up. It has nothing to with MFC's CObject::Serialize(). Also, you don't have to derive your object from CObject. Our serialize() method takes a pointer to a CArchive and returns an integer status.
  int CFoo::serialize
    (CArchive* pArchive)
  {
    int nStatus = SUCCESS;

    // Serialize the object ...
    ...
    
    return (nStatus);
  }
We'll get to the actual serialization process in a minute. Meanwhile, let's recognize a couple of important points: Assume CFoo represents an employee record that contains a couple of data members.
  class CFoo
  {
    // Construction/destruction
    public:
      CFoo::CFoo();
      virtual CFoo::~CFoo();

    // Methods
    public:
      int serialize (CArchive* pArchive);

    // Data members
    public:
      CString  m_strName;  // employee name
      int      m_nId;      // employee id
  };
We use CArchive's streaming operators << and >> to read/write the data members from/to the archive. CArchive knows how to serialize simple data types like int, float, DWORD, and objects like CString. The archive also knows whether it's in read or write mode. You can query its mode by calling CArchive::IsStoring(). CFoo's serialization method can then be written as:
  int CFoo::serialize
    (CArchive* pArchive)
  {
    int nStatus = SUCCESS;

    // Serialize the object ...
    ASSERT (pArchive != NULL);
    try
    {
      if (pArchive->IsStoring()) {
         // Write employee name and id
         (*pArchive) << m_strName;
         (*pArchive) << m_nId;
      }
      else {
         // Read employee name and id
         (*pArchive) >> m_strName;
         (*pArchive) >> m_nId;
      }
    }
    catch (CException* pException)
    {
      nStatus = ERROR;
    }
    return (nStatus);
  }

Step 4 - Clean up

When you've finished serializing, you should clean up by closing the archive and datafile.
  pArchive->Close();
  delete pArchive;
  pFile->Close();
  delete pFile();

Conclusion

Well, there you have it - serialization in a (very small) nutshell. In Part 2, we'll see how to gracefully handle reading invalid data stores and support different versions of our object. In Part 3, we'll see how to serialize complex objects.
You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
QuestionChanging the format of the data in the file Pin
AORD
13:26 29 Sep '07  
AnswerRe: Changing the format of the data in the file Pin
Ravi Bhavnani
18:51 9 Oct '07  
GeneralAbout the contents of the file Pin
cristitomi
23:24 12 Feb '07  
AnswerRe: About the contents of the file Pin
Ravi Bhavnani
2:34 13 Feb '07  
GeneralRe: About the contents of the file Pin
cristitomi
3:22 13 Feb '07  
GeneralRe: About the contents of the file Pin
Ravi Bhavnani
4:25 13 Feb '07  
Generaltrouble in reading in serialized list structures Pin
itsh11
13:01 15 Dec '04  
GeneralRe: trouble in reading in serialized list structures(typo corrected) Pin
itsh11
5:11 16 Dec '04  
GeneralReading a file using serialization Pin
hemanth_phk
12:55 9 Sep '04  
GeneralRe: Reading a file using serialization Pin
Ravi Bhavnani
13:28 9 Sep '04  
GeneralRe: Reading a file using serialization Pin
Thomas Mielke
15:58 11 Oct '07  
GeneralCArchive and .NET Pin
Daniel S. Horwitz
7:37 12 Jul '04  
GeneralIn memory serialization Pin
no_reg_name
3:59 7 May '04  
GeneralRe: In memory serialization Pin
Ravi Bhavnani
7:02 7 May '04  
GeneralSerialization using Dialog application Pin
HybridLlama
17:57 12 Jan '04  
GeneralRe: Serialization using Dialog application Pin
Ravi Bhavnani
7:37 16 Jan '04  
GeneralRe: Serialization using Dialog application Pin
HybridLlama
10:56 16 Jan '04  
GeneralRe: Serialization using Dialog application Pin
Ravi Bhavnani
4:32 17 Jan '04  
GeneralRe: Serialization using Dialog application Pin
HybridLlama
9:28 17 Jan '04  
GeneralDitching.NET serialization in favor of MFC Pin
MtnBiknGuy
17:49 28 Aug '03  
GeneralRe: Ditching.NET serialization in favor of MFC Pin
Ravi Bhavnani
5:33 29 Aug '03  
AnswerRe: Ditching.NET serialization in favor of MFC Pin
Gordon Brandly
7:48 31 Aug '05  
GeneralProblem reading file Pin
Count Zer0
10:19 21 Jul '03  
GeneralRe: Problem reading file Pin
Anonymous
6:43 16 Jan '04  
Generallibrary for XML serialization in C++ ? Pin
Anonymous
2:15 17 Mar '03  


Last Updated 25 Nov 2002 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009