29.8 Serializing a ''CRuntimeClass''

Here's a special bit of MFC arcana that took quite a while to figure out! How do we serialize a CRuntimeClass ? Here's an example of how to do it from force.cpp file. The long comment explains why this was a difficult thing to do.

void cForceClassEvade::Serialize(CArchive &ar) 
{ 
    cForce::Serialize(ar); 
        /* I had a hard time figuring out how to serialize the 
            CRuntimeClass *_pnodeclass. 
            (1) You can't call _pnodeclass.Serialize(ar), as this is 
                not a method of CRuntimeClass. 
            (2) Nor can you save off the CRuntimeClass m_lpszClassName 
                field and try and use RUNTIME_CLASS to reconstruct it, 
                as RUNTIME_CLASS requires a literal argument and not a 
                CString. 
            (3) MFC provides a CArchive::SerializeClass(CRuntimeClass 
                *prtc). But it doesn't do the job either. It's 
                actually designed more for use as a compatibility 
                type-checker. If I put in 
                ar.SerializeClass(_pnodeclass), when I save and load, 
                I don't get anything read back into _pnodeclass 
                because SerializeClass treats its argument as a const 
                and won't change it in the load! 
            (4) What DOES work is to save with 
                ar.WriteClass(_pnodeclass) and load with 
                _pnodeclass = ar.ReadClass(). */ 
    if (ar.IsStoring()) //Writing data. 
    { 
        ar.WriteClass(_pnodeclass); 
        ar << _evadechildclasses << _dartacceleration << _dartspeedup; 
    } 
    else //reading data 
    { 
        _pnodeclass = ar.ReadClass(); 
        ar >> _evadechildclasses >> _dartacceleration >> _dartspeedup; 
    } 
} 


    Part I: Software Engineering and Computer Games
    Part II: Software Engineering and Computer Games Reference