65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.71/5 (3投票s)

2007 年 2 月 6 日

viewsIcon

43118

downloadIcon

314

C++ 中序列化 CArray 类/对象的示例

引言

很多人经常询问如何序列化 CArray 对象。 序列化 CArray 有一个简单的方法。 通过阅读示例,您会发现它非常简单。

使用示例

这是要序列化的数据的类。 我使用了 intCString 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 日:初始发布
© . All rights reserved.