Click here to Skip to main content
15,867,568 members
Articles / Desktop Programming / MFC

A Serialization Primer - Part 1

Rate me:
Please Sign up or sign in to vote.
4.64/5 (43 votes)
25 Nov 2002CPOL2 min read 371.4K   185   66
This tutorial describes how to easily serialize a simple object.

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

  • Part 1 introduces the basics of serialization.
  • Part 2 explains how to gracefully handle reading invalid data stores and support versioning.
  • Part 3 describes how to serialize complex objects.

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:

  • A CFile object representing the datafile
  • A CArchive object that provides the serialization context
  • The object being serialized

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.

C++
// 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.

C++
// 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.

C++
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:

  • The same method CFoo::serialize() is used to read/write the object from/to persistent storage.
  • CFoo::serialize() doesn't know anything about the datafile bring accessed.

Assume CFoo represents an employee record that contains a couple of data members.

C++
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:

C++
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.

C++
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.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Technical Lead
Canada Canada
Ravi Bhavnani is an ardent fan of Microsoft technologies who loves building Windows apps, especially PIMs, system utilities, and things that go bump on the Internet. During his career, Ravi has developed expert systems, desktop imaging apps, marketing automation software, EDA tools, a platform to help people find, analyze and understand information, trading software for institutional investors and advanced data visualization solutions. He currently works for a company that provides enterprise workforce management solutions to large clients.

His interests include the .NET framework, reasoning systems, financial analysis and algorithmic trading, NLP, HCI and UI design. Ravi holds a BS in Physics and Math and an MS in Computer Science and was a Microsoft MVP (C++ and C# in 2006 and 2007). He is also the co-inventor of 3 patents on software security and generating data visualization dashboards. His claim to fame is that he crafted CodeProject's "joke" forum post icon.

Ravi's biggest fear is that one day he might actually get a life, although the chances of that happening seem extremely remote.

Comments and Discussions

 
Questioncross-platform CArray serilization Pin
Member 129807469-Jan-23 21:56
Member 129807469-Jan-23 21:56 
GeneralMy vote of 4 Pin
sagar131015-Aug-12 20:56
sagar131015-Aug-12 20:56 
Generalthank you ! Pin
mayjune5624-Jun-12 18:46
mayjune5624-Jun-12 18:46 
GeneralRe: thank you ! Pin
Ravi Bhavnani25-Jun-12 1:16
professionalRavi Bhavnani25-Jun-12 1:16 
GeneralThe links in the conclusion to the other parts are dead Pin
Harrison H7-Oct-10 10:23
Harrison H7-Oct-10 10:23 
GeneralRe: The links in the conclusion to the other parts are dead Pin
Ravi Bhavnani7-Oct-10 10:33
professionalRavi Bhavnani7-Oct-10 10:33 
GeneralRe: The links in the conclusion to the other parts are dead Pin
Harrison H7-Oct-10 10:38
Harrison H7-Oct-10 10:38 
QuestionChanging the format of the data in the file Pin
AORD29-Sep-07 12:26
AORD29-Sep-07 12:26 
AnswerRe: Changing the format of the data in the file Pin
Ravi Bhavnani9-Oct-07 17:51
professionalRavi Bhavnani9-Oct-07 17:51 
GeneralAbout the contents of the file Pin
cristitomi12-Feb-07 22:24
cristitomi12-Feb-07 22:24 
AnswerRe: About the contents of the file Pin
Ravi Bhavnani13-Feb-07 1:34
professionalRavi Bhavnani13-Feb-07 1:34 
GeneralRe: About the contents of the file Pin
cristitomi13-Feb-07 2:22
cristitomi13-Feb-07 2:22 
GeneralRe: About the contents of the file Pin
Ravi Bhavnani13-Feb-07 3:25
professionalRavi Bhavnani13-Feb-07 3:25 
Glad I could be of help, Cristi!

/ravi

This is your brain on Celcius
Home | Music | Articles | Freeware | Trips
ravib(at)ravib(dot)com

Generaltrouble in reading in serialized list structures Pin
itsh1115-Dec-04 12:01
itsh1115-Dec-04 12:01 
GeneralRe: trouble in reading in serialized list structures(typo corrected) Pin
itsh1116-Dec-04 4:11
itsh1116-Dec-04 4:11 
GeneralReading a file using serialization Pin
hemanth_phk9-Sep-04 11:55
susshemanth_phk9-Sep-04 11:55 
GeneralRe: Reading a file using serialization Pin
Ravi Bhavnani9-Sep-04 12:28
professionalRavi Bhavnani9-Sep-04 12:28 
GeneralRe: Reading a file using serialization Pin
Thomas Mielke11-Oct-07 14:58
Thomas Mielke11-Oct-07 14:58 
GeneralCArchive and .NET Pin
Daniel S. Horwitz12-Jul-04 6:37
Daniel S. Horwitz12-Jul-04 6:37 
GeneralIn memory serialization Pin
no_reg_name7-May-04 2:59
no_reg_name7-May-04 2:59 
GeneralRe: In memory serialization Pin
Ravi Bhavnani7-May-04 6:02
professionalRavi Bhavnani7-May-04 6:02 
GeneralSerialization using Dialog application Pin
HybridLlama12-Jan-04 16:57
HybridLlama12-Jan-04 16:57 
GeneralRe: Serialization using Dialog application Pin
Ravi Bhavnani16-Jan-04 6:37
professionalRavi Bhavnani16-Jan-04 6:37 
GeneralRe: Serialization using Dialog application Pin
HybridLlama16-Jan-04 9:56
HybridLlama16-Jan-04 9:56 
GeneralRe: Serialization using Dialog application Pin
Ravi Bhavnani17-Jan-04 3:32
professionalRavi Bhavnani17-Jan-04 3:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.