我在写Serialize函数时有几个WINDOWS结体(POINT, RECT...)竟然可以直接持串行化, 但自己的定义的结构却又不技持, 查看CArchive类声明,又没有找到明显关于结构体(POINT, RECT...)的<<操作符,请高手分析下这是怎么一回事.

解决方案 »

  1.   

    Serialization: Making a Serializable Class  
    -----------------------------------------------
    Five main steps are required to make a class serializable. They are listed below and explained in the following sections: 1. Deriving your class from CObject (or from some class derived from CObject). 2. Overriding the Serialize member function. 3 .Using the DECLARE_SERIAL macro in the class declaration. 4. Defining a constructor that takes no arguments. 5. Using the IMPLEMENT_SERIAL macro in the implementation file for your class. If you call Serialize directly rather than through the >> and << operators of CArchive, the last three steps are not required for serialization. 
      

  2.   

    1楼的答非所问. 我说的意思是有些系统定义的结构体AR竟然直接支持,但又找不到关于该结构的<<操作符,具体请看如下代码:   POINT dot1;
       RECT  rect1;
       MYSTRUCT struct1;   if(ar.IsStoring())
       {
         ar<<dot1;   //这个结构体是直接支持的
         ar<<rect1;  //这个结构体是直接支持的
         ar<<struct1; //自定义结构体不技持会报错, 只能写下如下:
         ar.Write(&struct1, sizeof(struct1));
       }
       else
       {
        //读
       }
      

  3.   

    找到答案很简单,在有问题的那行上加断点后运行,然后F11进去看看进哪个函数了
    例如CRect进入下面函数了。
    _AFXWIN_INLINE CArchive& AFXAPI operator<<(CArchive& ar, const RECT& rect)
    { ar.Write(&rect, sizeof(RECT)); return ar; }
      

  4.   

    1. 整个软件我还没完成, 还不能运行到这块, 目前只是在写类拉口,
    2. 如果是个类我觉得一切都有可能,关键是POINT, RECT,是一个地地道道的C结构 
    typedef struct tagPOINT
        {
        LONG x;
        LONG y;
        }  POINT;typedef struct tagRECT
        {
        LONG left;
        LONG top;
        LONG right;
        LONG bottom;
        }  RECT;
      

  5.   

    6楼,我不是问实现类串行化的方法, 这个问题在网上一抓一大把, 我只是惊异有些WINDOWS结构竟然直接被CArchive类支持了, 但是我在CArchive类中找不到定义于对些结构的<<和>>操作符. 因为我自己有个自定义结构是不被支持的,需要特殊处理,同样是结构体,为什么差别这么大呢?我想知道的是这个问题
      

  6.   

    // CArchive output helpers
    _AFXWIN_INLINE CArchive& AFXAPI operator<<(CArchive& ar, SIZE size)
    { ar.Write(&size, sizeof(SIZE)); return ar; }
    _AFXWIN_INLINE CArchive& AFXAPI operator<<(CArchive& ar, POINT point)
    { ar.Write(&point, sizeof(POINT)); return ar; }
    _AFXWIN_INLINE CArchive& AFXAPI operator<<(CArchive& ar, const RECT& rect)
    { ar.Write(&rect, sizeof(RECT)); return ar; }
    _AFXWIN_INLINE CArchive& AFXAPI operator>>(CArchive& ar, SIZE& size)
    { ar.Read(&size, sizeof(SIZE)); return ar; }
    _AFXWIN_INLINE CArchive& AFXAPI operator>>(CArchive& ar, POINT& point)
    { ar.Read(&point, sizeof(POINT)); return ar; }
    _AFXWIN_INLINE CArchive& AFXAPI operator>>(CArchive& ar, RECT& rect)
    { ar.Read(&rect, sizeof(RECT)); return ar; }
      

  7.   

    没有任何人要求你用你没完成的程序测试,随便创建一个SDI测试程序,在doc里加入上面代码就可以测试了,难道每个测试都要等你项目完成才进行,那也太不现实了
    我上面给你的函数明明是一个地地道道的C结构,为什么你觉得类可能地地道道的C结构就不可能?你仔细看我帖子了?
      

  8.   

    这些内置的结构体像RECT,POINT都是MS自己定义好的,MS帮你做了这些工作,重载了operator >> 和operator <<,使这些能够支持序列化你自己定义的结构体类型,谁也不知道你会在里面定义多少成员,定义哪些类型的成员,这个很明显是要靠程序员自己去做的,MS是不能帮你做,也不可能帮你做
      

  9.   

    9楼,我是来求答案的, 别的话多说无益, 徒增火药味. 8楼VisualEleven已经给出答案了. 至于为什么纯C结构不可能,这个问题我不想多说.大家自有见解还是感谢大家的帮助,结贴吧