最近在给一个SDI程序添加打开/保存功能的时候,由于之前没有接触过SDI,对于Serialize不熟悉。绕了半天还是用另外种办法实现了功能,没有使用Serialize。现在回过头来想了解下Serialize的用法。
基本情况是:
SDI程序,有若干CFormView子界面(Dialog Based),每个界面中都有一些独立的数据,需要新增File->Open, File->Save功能。//CForm1
typedef struct {
 int iVal1;
 int iVal2;
 float fVal3;
 ...
}XXData1;//CForm2
typedef struct {
 int iVal1;
 float fVal2;
 ...
}XXData2;//CForm3
typedef struct {
 float fVal1
 float fVal2;
 ...
}XXData3;
我现在的做法是在菜单操作Open/Save的时候先区分当前子界面,然后将需要保存的数据保存/装载,再通过消息通知相应界面刷新.
Serialize是CObject的虚函数, 我是想只对我需要个几个独立的数据结构进行保存和读取.
使用Serialize的话在Document/View/Frame中该如何处理?

解决方案 »

  1.   

    Serialize是对象序列化用的,和你的存储/读取有什么关系?
    CObject::Serialize()作用是任何类从CObject继承,可以自定义一个序列化的方法,把类变成串
      

  2.   

    在void CYouDoc::Serialize(CArchive& ar)
    {
    if (ar.IsStoring())
    {
    // TODO: add storing code here
    ar << 你要保存的数据1 << 你要保存的数据2
    }
    else
    {
    // TODO: add loading code here
    ar >> 你要读取的数据1 >> 你要读取的数据2 , 顺序与保存时的顺序相同
    }
    }
      

  3.   

    MFC的序列化实际挺有用的!将数据(当然,要有一定的结构)放到doc中,调用序列化,各种所用的数据结构当然也实现了序列化,这要存储是很方便的!
      

  4.   

    楼主用的是单文档啊,那也可以啊,CYourDoc类里增三个成员变量:
    XXData1 m_data1;
    XXData2 m_data2;
    XXData3 m_data3;
    再用一个标志来区分当前的数据:
    enum MyDataTyp{Data1, Data2, Data3};
    MyDataTyp m_datatyp;以上成员变量最好设置成私有的,并提供相应的set,get函数,以供CFormX类访问。还是建议通过CDocument的Serialize(CArchive& ar)来存取程序里的数据,这个轮子跑得很快,
    很强大,为何要自己再造一个呢?
      

  5.   

    有几点不明白:
    - 在重复执行File->Open操作的时候,只有第一次能进入Serialize(CArchive& ar), 读取数据ar >> data1 >> data2,之后都不进入该处执行读取操作。程序运行过程中只让读取一次?- Load新数据后怎么让指定Formview(CFormX)刷新界面? 
    之前我是在载入新数据后通过消息指定Formview(CFormX),运行一个自定义的函数将新的数据刷新界面。
    现在我在Serialize(CArchive& ar)中Load新数据后,发送该消息至指定Formview(CFormX),通知刷新界面后,只有部分控件刷新...是否有其他更方便的方法?
      

  6.   

    OnOpenDocument/OnNewDocument
    {
      DeleteContent();
      Serialize(ar);//OnNewDocument 没有  
      //在Serialize 时 ,数据从文件到文档变量
      SetPathName();
    }InitialUpdateFrame
    CView::OnInitialUpdate
    //在InitialUpdate时,数据从文档变量到控件//当操作CView控件时,View类修改文档变量,并且设置ModifyFlag
      

  7.   

    刷新的问题是我代码出了点问题,已解决。待解决的问题:- 在重复执行File->Open操作的时候,只有第一次能进入Serialize(CArchive& ar), 读取数据ar >> data1 >> data2,之后都不进入该处执行读取操作。程序运行过程中只让读取一次?怎样使得每次都重新载入一次数据?- 在save的时候能否指定格式?每次保存时都显示的:All Files (*.*)