题目描述:
现有实体line和polyline,需要将这些实体序列化输入和输出,通过对话框保存和打开。
一、保存模型数据(序列化)
void CEncloseAreaDlg::OnBnClickedButtonSavedata()
{
// TODO: 在此添加控件通知处理程序代码
if (!m_bFilePath)
{
AfxMessageBox(_T("请您先导入数据!"));
return;
}
// 设置过滤器
TCHAR szFilter[] = _T("midas XD Files(*.gdb)||");
// 构造保存文件对话框
CFileDialog fileDlg(FALSE, _T("gdb"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);
CString strFilePath;
if (IDOK == fileDlg.DoModal())
{
strFilePath = fileDlg.GetPathName();
CFile file;
file.Open(strFilePath, CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store);
CDataDB* pDB = CDataDB::GetInstance();
pDB->Serialize(ar);
ar.Close();
}
}
二、打开模型数据(序列化)
void CEncloseAreaDlg::OnBnClickedButtonOpendata()
{
// TODO: 在此添加控件通知处理程序代码
// 设置过滤器
TCHAR szFilter[] = _T("midas XD Files(*.gdb)||");
// 构造打开文件对话框
CFileDialog fileDlg(TRUE, _T("gdb"), NULL, 0, szFilter, this);
CString strFilePath;
CDataDB* pDB = CDataDB::GetInstance();
// 显示打开文件对话框
if (IDOK == fileDlg.DoModal())
{
// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里
strFilePath = fileDlg.GetPathName();
CFile file;
file.Open(strFilePath, CFile::modeRead);
CArchive ar(&file, CArchive::load);
pDB->Serialize(ar);
ar.Close();
file.Close();
}
//绘制模型
CWnd *pwnd = GetDlgItem(IDC_STATIC_TESTMODEL);
CDC *pDC = pwnd->GetDC();
pwnd->Invalidate();
pwnd->UpdateWindow();
pDC->Rectangle(0, 0, 400, 400);
CPen *ppenRed = new CPen;
ppenRed->CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
CGdiObject *pOldpen = pDC->SelectObject(ppenRed);
//绘制直线
int nLineNum = pDB->getLineNum();
for (int i=0;i<nLineNum;i++)
{
CLine line = pDB->GetLine(i);
line.draw(pDC);
}
//绘制多段线
vector<CPolyline> PolylineVector = pDB->GetPolylineVector();
for (unsigned int i = 0;i < PolylineVector.size(); i++)
{
PolylineVector[i].draw(pDC);
}
}
三、在存放实体的类中书写序列化的method
void CDataDB::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
size_t num = m_LineVector.size();
ar << num;
for (size_t i = 0;i < num; i++)
{
m_LineVector[i].Serialize(ar);
}
num = m_PolylineVector.size();
ar << num;
for (size_t j = 0;j < num;j++)
{
m_PolylineVector[j].Serialize(ar);
}
}
else
{
int num = 0;
ar >> num;
for (int i = 0;i < num;i++)
{
CLine line;
line.Serialize(ar);
AddLine(line);
}
ar >> num;
for (int j = 0;j < num; j++)
{
CPolyline polyline;
polyline.Serialize(ar);
AddPolyline(polyline);
}
}
}
四、类CLine中添加序列化的method
void CLine::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
CPoint2D ptStart = getStartPoint();
CPoint2D ptEnd = getEndPoint();
ptStart.Serialize(ar);
ptEnd.Serialize(ar);
}
else
{
CPoint2D ptStart;
CPoint2D ptEnd;
ptStart.Serialize(ar);
ptEnd.Serialize(ar);
setPoints(ptStart,ptEnd);
}
}
五、类CPolyine中添加序列化的method
void CPolyline::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
vector<CPoint2D> points = getPoints();
size_t num = points.size();
ar << num;
for (size_t i = 0; i<num;i++)
{
points[i].Serialize(ar);
}
}
else
{
size_t num = 0;
ar >> num;
for (size_t i = 0; i<num;i++)
{
CPoint2D pt;
pt.Serialize(ar);
addPoint(pt);
}
}
}
六、在类Point中添加序列化的method
void CPoint2D::Serialize(CArchive& ar)
{
if (ar.IsStoring())
ar << x << y;
else
ar >> x >> y;
}
七、效果:
导入实体后,通过序列化的方式存储数据,打开文本后可以看到是以二进制的方式存储的。然后使用打开按钮打开这个二进制文本,并使用这个文本中的数据绘制图形。