for(int i=0;i ar>>pgraph; pview->m_obarray.add(pgraph); } } } 类对象 if (ar.isstoring()) { // todo: 在此添加存储代码 } else { 但是读取数据的时候还需要重绘图像:转回view类,因为在 // todo: view类加载的时候会自动调用在此添加加载代码ondraw(), 在ondraw()中添加如下语句 int ncount; ncount=m_obarray.getsize(); for(int i=0;i } pview->m_obarray.serialize(ar); // 将这个数据传递给 } 其中cobarray类对象读取数据的方法:(以下是mfc源代码,无须用户添 ((cgraph*)m_obarray.getat(i))->draw(pdc); void cobarray::serialize(carchive& ar) } 基本上完成了通过serialize保存和打开文件。 { assert_valid(this); 用serialize的好处:通过缓存来保存,当缓存区满了才进行一次读 /写,因此提高了应用程序的效率 cobject::serialize(ar); 另外 , archive 对象是支持序列化的,因此在读写数据的时候即可以按以上方法在 doc 类的 serialize 来保存和打开数据。 因此修改 doc 中的 serialize 为 if (ar.isstoring()) void cgraphicserialdoc::serialize(carchive& ar) { { ar.writecount(m_nsize); position pos=getfirstviewposition();// 获得第一个视类对象在对象列表中的位置 for (int_ptr i = 0; i < m_nsize; i++) cgraphicserialview *pview=(cgraphicserialview*)getnextview(pos);// ar << m_pdata[i]; 找到当前视类对象的指针,由于这是单文档,因 } else { } } void cgraphicserialdoc::serialize(carchive& ar) dword_ptr noldsize = ar.readcount(); { setsize(noldsize); ?? for (int_ptr i = 0; i < m_nsize; i++) m_obarray.serialize(ar); //doc 类中定义m_obarray的情况 ar >> m_pdata[i]; } } void cgraphicserialdoc::deletecontents() 下面直接在 doc 类中使用 cobarray 对象(取消之前定义在 view 类中的该类对象) { 在 doc 类中定义 cobarray m_obarray; int ncount; 存图形数据的代码修改为: ncount=m_obarray.getsize(); cgraphicdoc *pdoc=getdocument();// 通过视类提供的getdocument()方法来获得doc类指针 /*for(int i=0;i pdoc->m_obarray.add(pgraph); { 修改其他位置的 m_obarray delete m_obarray.getat(i); void cgraphicserialview::ondraw(cdc* pdc) //m_obarray.removeat(i); { } ?? m_obarray.removeall();*/ ncount=pdoc->m_obarray.getsize(); while(ncount--) for(int i=0;i { { delete m_obarray.getat(ncount); ((cgraph*)pdoc->m_obarray.getat(i))->draw(pdc); //doc类中定义m_obarray的情况 } 当我们新建和打开文档的时候,我们之前的文档对象并没有被销毁(系统利此时应删除文档对象。 在文档类中重载函数 void cgraphicserialdoc::deletecontents() 来删 m_obarray.removeat(ncount); } cdocument::deletecontents(); }
vc序列化问题(3)
2019-06-17 12:16
vc序列化问题(3).doc
将本文的Word文档下载到电脑
下载失败或者文档不完整,请联系客服人员解决!