C++ 中序列化 CArray 类/对象






2.71/5 (3投票s)
2007 年 2 月 6 日

43118

314
C++ 中序列化 CArray 类/对象的示例
引言
很多人经常询问如何序列化 CArray
对象。 序列化 CArray
有一个简单的方法。 通过阅读示例,您会发现它非常简单。
使用示例
这是要序列化的数据的类。 我使用了 int
、CString
和 char*
,以便您更好地理解。
#pragma once
class SaveFile :public CObject
{
DECLARE_SERIAL(SaveFile)
public:
SaveFile(void);
SaveFile(SaveFile &Sv)
{*this=Sv;}
~SaveFile(void);
CString FName;
char *FData;
ULONGLONG MySize;
virtual void Serialize(CArchive &pArchive);
SaveFile& operator=(SaveFile & SvFi);
};
这是 SaveFile
类的 CPP 文件。 使用 CArchive
来存储和加载文件中的 CArray
。
#include "StdAfx.h"
#include "SaveFile.h"
IMPLEMENT_SERIAL(SaveFile,CObject,0)
SaveFile::SaveFile(void)
{}
SaveFile::~SaveFile(void)
{}
void SaveFile::Serialize(CArchive & pArchive)
{
CObject::Serialize(pArchive);
if(pArchive.IsStoring())
{
pArchive<<FName<<MySize;
for(int i=0;i<MySize;i++)
pArchive<<FData[i];
}
else
{ pArchive>>FName>>MySize;
FData=new char[MySize];
for(int i=0;i<MySize;i++)
pArchive>>FData[i];
}
}
SaveFile& SaveFile::operator =(SaveFile&SvFo)
{
FName=SvFo.FName;
MySize=SvFo.MySize;
FData=new char[MySize];
for(int i=0;i<MySize;i++)
FData[i]=SvFo.FData[i];
return *this;
}
SaveFileHandler
类用于将 Savefile
类的对象存储/加载到/从文件中。
在此 CPP 中,SaveFileHandler SerializeElements<SaveFile>(CArchive& ar, SaveFile* pElements, int nCount)
函数非常重要。 这是一个全局函数,可以从任何类调用。
SaveFileHandler.h
#pragma once
#include "SaveFile.h"
class SaveFileHandler
{
public:
SaveFileHandler(void);
public:
~SaveFileHandler(void);
void AddSomeData();
void SerializeCArray();
CArray<SaveFile, SaveFile&> SF;
};
SaveFileHandler.cpp
#include "StdAfx.h"
#include "SaveFileHandler.h"
#include "SaveFile.h"
SaveFileHandler::SaveFileHandler(void)
{}
SaveFileHandler::~SaveFileHandler(void)
{}
SaveFileHandler::AddSomeData()
{
SaveFile SvFo ;
int Length;//assuming some length
SvFo.FData=new char[(size_t)Length];
SvFo.MySize=Length;
for(int i=0;i<Length;i++)
SvFo.FData[i]=FData[i]; //assuming FData have some Data in it
SvFo.FName=MainPath;
this->SF.Add(SvFo);
}
SaveFileHandler::SerializeCArray()
{
CFile SvFi("SomeFile.dhari",CFile::modeCreate|CFile::modeWrite);
CArchive Ar(&SvFi,CArchive::store);
this->SF.Serialize(Ar);
}
template <> inline void AFXAPI SerializeElements<SaveFile>
(CArchive& ar, SaveFile* pElements, int nCount)
{
for (int i=0;i < nCount; i++,pElements++)
{
if(ar.IsStoring())
{
pElements->Serialize(ar);
}
else
{
SaveFile* pSv = new SaveFile();
pSv->Serialize(ar);
*pElements = *pSv;
}
}
}
结论
欢迎并感谢您的反馈,无论其是否具有建设性。
历史
- 2007 年 2 月 6 日:初始发布