CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 3 of 3

Thread: Serializing

  1. #1
    Join Date
    May 1999
    Posts
    7

    Serializing

    Is it possible to save a object of this type?
    class memory {
    public:
    memory();
    int m_Mem[MAXMEM];
    CString Noun[MAXWORDS];
    CString Adjective[MAXWORDS];
    CString Verb[MAXWORDS];
    CString Nothing[MAXWORDS];
    void CheckWord(CString word);
    void SortIn(CString word, int type);
    private:
    CExtraDlg ExtraDlg;
    int NounPosition;
    int AdjectivePosition;
    int VerbPosition;
    int NothingPosition;
    };
    It should be saved in this way:

    CFile f;
    f.Open("backup.iq",
    CFile::modeCreate | CFile::modeWrite);
    memory ar(&f, CArchive::store);
    ar << brain; //Brain is the memory object

    What should I rewrite?
    Please help me!%

  2. #2
    Join Date
    May 1999
    Posts
    3

    Re: Serializing

    First, you need to go into the header file and add a couple line. The First one is to make the class public to CObject and second you need to declare the class as serial.

    the things chaged are " : public CObject" and "DECLARE_SERIAL(memory)"

    Here is an example:


    class memory : public CObject
    {
    DECLARE_SERIAL(memory)

    public:
    memory();
    int m_Mem[MAXMEM];
    CString Noun[MAXWORDS];
    CString Adjective[MAXWORDS];
    CString Verb[MAXWORDS];
    CString Nothing[MAXWORDS];
    void CheckWord(CString word);
    void SortIn(CString word, int type);
    private:
    CExtraDlg ExtraDlg;
    int NounPosition;
    int AdjectivePosition;
    int VerbPosition;
    int NothingPosition;
    };




    You can pretty much put the DECLARE_SERIAL() call anywhere in the class definition just to let you know. Now the next step is to open the CPP file and add the line "IMPLEMENT_SERIAL(memory, CObject, 1)" BEFORE any function definitions. Here is an example of what it might look like:


    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif

    IMPLEMENT_SERIAL(memory,CObject,1)

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    memoryr::memory()
    {
    ...



    It MUST be called before any function definitions I stress this fact...

    Also since these are macro calls and not function calls you do not need the semicolin ';' at the end of the line.

    Now one last step, override the default Serialize class. Simply right click the "memory" class and click "add member function" and add this:

    void Serialize(CArchive& ar)

    In the Serialize function add the code:


    void memory::Serialize(CArchive& ar)
    {
    // ALWAYS call the base class serialize first!
    CObject::Serialize(ar);

    if (ar.IsStoring())
    {
    ar << var1 << var2 << var3 ... and so on;
    }
    else
    {
    ar >> var1 >> var2 >> var3 ... and so on;
    }
    }




    If you have an array somewhere you can do something like:


    if (ar.IsStoring())
    {
    for (int i = 0; i < m_pArray.GetSize(); i++)
    {
    ar << m_pArray.GetAt(i);
    }
    }




    Okay, your class should now be serializable so now you need to "serialize" it. That's easy as well. Simply call this somewhere and it will be written out to a file.


    // Save the class to a file
    CFile* pFile = new CFile;
    if (pFile->Open("Test.mem", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary) != 0)
    {
    // create the archive
    CArchive ar(pFile, CArchive::store);

    // write out the data
    mem.Serialize(ar);

    // clean up a bit
    ar.Close();
    pFile->Close();
    }
    else
    {
    // the file didn't open
    }




    Now that should work, and to read in the file you'd do something like this:


    CFile* pFile = new CFile;
    if (pFile->Open("Test.mem", CFile::modeRead | CFile::typeBinary))
    {
    CArchive ar(pFile, CArchive::load);
    mem.Serialize(ar);

    ar.Close();
    pFile->Close();
    }




    well, I hope that's enough info. I assumed that you learn by example because that's how I learn best. If you need further help or maybe in a more written out form feel free to write me at [email protected]

    - Mike


  3. #3
    Join Date
    May 1999
    Posts
    7

    Re: Serializing

    Don't forget IMPLEMENT_SERIAL in the implementation of the object you are serializing.


    Freedom is knowing you can burn all your software without losing a minute's sleep.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured