最近在给一个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中该如何处理?
基本情况是:
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中该如何处理?
CObject::Serialize()作用是任何类从CObject继承,可以自定义一个序列化的方法,把类变成串
{
if (ar.IsStoring())
{
// TODO: add storing code here
ar << 你要保存的数据1 << 你要保存的数据2
}
else
{
// TODO: add loading code here
ar >> 你要读取的数据1 >> 你要读取的数据2 , 顺序与保存时的顺序相同
}
}
XXData1 m_data1;
XXData2 m_data2;
XXData3 m_data3;
再用一个标志来区分当前的数据:
enum MyDataTyp{Data1, Data2, Data3};
MyDataTyp m_datatyp;以上成员变量最好设置成私有的,并提供相应的set,get函数,以供CFormX类访问。还是建议通过CDocument的Serialize(CArchive& ar)来存取程序里的数据,这个轮子跑得很快,
很强大,为何要自己再造一个呢?
- 在重复执行File->Open操作的时候,只有第一次能进入Serialize(CArchive& ar), 读取数据ar >> data1 >> data2,之后都不进入该处执行读取操作。程序运行过程中只让读取一次?- Load新数据后怎么让指定Formview(CFormX)刷新界面?
之前我是在载入新数据后通过消息指定Formview(CFormX),运行一个自定义的函数将新的数据刷新界面。
现在我在Serialize(CArchive& ar)中Load新数据后,发送该消息至指定Formview(CFormX),通知刷新界面后,只有部分控件刷新...是否有其他更方便的方法?
{
DeleteContent();
Serialize(ar);//OnNewDocument 没有
//在Serialize 时 ,数据从文件到文档变量
SetPathName();
}InitialUpdateFrame
CView::OnInitialUpdate
//在InitialUpdate时,数据从文档变量到控件//当操作CView控件时,View类修改文档变量,并且设置ModifyFlag