书上都说,如果想实现一个可串行化的类,需要从CObject派生,并且加上DECLARE_SERIAL和IMPLEMENT_SERIAL等等……我想问的是,如果自己手动加上“friend CArchive& AFXAPI operator>>(...)”、“friend CArchive& AFXAPI operator<<(...)”和“virtual void Serialize(CArchive& ar)”是不是也能实现类的双向串行化了呢?我不太喜欢用MFC定义的那些鸟宏,什么都是宏,永远不知道程序里到底干了些什么。你们看,我做了一个类,比方叫“c”,我想实现“ar<<c”或“ar>>c”的功能,当然也想在文档视图结构的程序里能够顺利的串行化,然后我从CString的MFC源代码里拷贝了“<<”和“>>”两个函数的声明(因为开始时自己不太会写),改吧改吧,让它可以为我的类服务,这样是不是也算是实现类的串行化了呢?各位高手,告诉告诉我吧。我这样做,跟使用DECLARE_SERIAL和IMPLEMENT_SERIAL宏区别在哪里?

解决方案 »

  1.   

    支持串行化的类没有必要从CObject派生,我从来都自己实现,一般基础的东西最好别用MFC而使用WIN32API,这样的话移植性好
      

  2.   

    To FlyYang:感谢你的“异曲同工”,简单明了,我现在明白了。
    用宏倒是也没什么,其实我自己编程序时也经常自编些乱七八糟的宏。
    但是我展开看后,发送DECLARE_SERIAL宏好像只有“>>”的重载,而没有“<<”的。To bluebohe:“支持串行化的类没有必要从CObject派生”你确定吗?确定的话,学生可就这么记住了哦!不过你后面的话,我严重同意——在不考虑成本,或者不得不支持多平台的情况下。两位高手,谢谢你们。在这次思考中,我还意外发现两个以前没注意到的问题:1,像“friend CArchive& AFXAPI operator<<(...)”这样的函数定义有点意思哦,它看上去像是在这个类里重载/实现令一个类的函数。好像是这样,因为这个运算符重载函数明明是CArchive里的,而且,当使用“ar<<c”的时候,按理讲应当调用的是ar理的函数哦。但是这怎么可能呢?(我说明白了吗)2,上面那个重载函数的定义中,有一个const参数,即:
    friend CArchive& AFXAPI operator<<(CArchive& ar,const CMyClass& cSrc)”
    //这样一来,像下面这样的调用时:
    {
        cSrc.MemberFunc1(...);
    }
    就要求MemberFunc1必须也是const的:
    class CMyClass
    {
        MemberFunc1(...) const;
    }=============
    呵呵,两个发现,以前没注意。
      

  3.   

    全局operator<<是全局的,也就是说操作符接受所有可以转化成const CMyClass&的类,但是这可能不是你需要的行为。
    成员operator<<是每个类不同的,你可以为每个类写一个operator<<