Listing 2

class CJobDef : public CReferable
{
    friend CArchive &operator << (CArchive &ar, const CJobDefPtr &cand)
    {
        ar << cand->getTag();
        CArchive ar_def(cand->getTag(), CArchive::WRITE);
        // write object attributes to ar_def
        return ar;
    }
    friend CArchive &operator >> (CArchive &ar, CJobDefPtr &cand)
    {
        int tag;
        ar >> tag;
        CArchive ar_def(tag, CArchive::READ);
        // read object attributes from ar_def
        cand.impersonate(tag);
        return ar;
    }
};
class CJobInst : public CReferable
{
     friend CArchive & operator << ( 	CArchive &ar, const CJobInstPtr &cand)
    {
        ar << cand->m_defPtr;
        return ar;
    }
    friend CArchive & operator >> (CArchive &ar, CJobInstPtr &cand)
    {
        CJobDefPtr defPtr = new CJobDef;
        ar >>  defPtr;
        cand->m_defPtr = defPtr;
        return ar;
    }
};