转 自定义的支持序列化的类

时间:2021-09-08 19:22:02

http://stdsoft.blogbus.com/logs/56348472.html

 

#pragma once

#include <fstream>
#include <string>
#include <iostream>
using namespace std;

// Archive Flag values
enum ArchiveMode
{
AM_Loading = 0, // 反序列化
AM_Storing = 1, // 序列化
AM_UNKNOWN = 2, // 未知操作
};

class ArchiveX
{
public:
ArchiveX();
virtual ~ArchiveX(void);

public:
bool open(const string & strFilename,unsigned int nMode);

bool IsLoading() const;
bool IsStoring() const;

bool IsBufferEmpty();

void Flush();
void Close();

public:
ArchiveX & operator<<(bool b);
ArchiveX & operator<<(char ch);
ArchiveX & operator<<(unsigned char uch);
ArchiveX & operator<<(short s);
ArchiveX & operator<<(unsigned short us);
ArchiveX & operator<<(int i);
ArchiveX & operator<<(unsigned int ui);
ArchiveX & operator<<(long l);
ArchiveX & operator<<(unsigned long ul);
ArchiveX & operator<<(float f);
ArchiveX & operator<<(double d);
ArchiveX & operator<<(const string & str);
ArchiveX & operator<<(const wstring & str);

ArchiveX & operator>>(bool & b);
ArchiveX & operator>>(char & ch);
ArchiveX & operator>>(unsigned char & uch);
ArchiveX & operator>>(short & s);
ArchiveX & operator>>(unsigned short & us);
ArchiveX & operator>>(int & i);
ArchiveX & operator>>(unsigned int & ui);
ArchiveX & operator>>(long & l);
ArchiveX & operator>>(unsigned long & ul);
ArchiveX & operator>>(float & f);
ArchiveX & operator>>(double & d);
ArchiveX & operator>>(string & str);
ArchiveX & operator>>(wstring & str);

protected:
// 两个内部方法
unsigned int Read(void* lpBuf, unsigned int nMax);
unsigned int Write(const void* lpBuf, unsigned int nMax);

protected:
ArchiveMode m_nMode;
fstream m_File;
string m_strFilename;
};

  

 

#include "stdafx.h"
#include "ConsoleTest.h"

//#include "ArchiveX.h"

//#include "YangJing.h"

ArchiveX::ArchiveX()
{
m_nMode = AM_UNKNOWN;
}

bool ArchiveX::open( const string & strFilename,unsigned int nMode )
{
//为了确保各种操作都处于安全状态,要根据指定的nMode检测文件的状态
//例如:如果是Loading操作,则要检测文件是否存在
//
m_strFilename = strFilename;
if (m_strFilename.length() == 0)
{
m_strFilename = "unknown.dat";
}

switch(nMode)
{
case AM_Storing:
{
m_File.open(strFilename.c_str(), ios_base::trunc|ios_base::out|ios_base::binary);

if (m_File.is_open() == false)
{
m_nMode = AM_UNKNOWN;
return false;
}
m_nMode = AM_Storing;
return true;
}
break;
case AM_Loading:
{
m_File.open(strFilename.c_str(), ios_base::in|ios_base::binary);

if (m_File.is_open() == false)
{
m_nMode = AM_UNKNOWN;
return false;
}
m_nMode = AM_Loading;
return true;
}
break;
default:
{
m_nMode = AM_UNKNOWN;
return false;
}
}

return false;
}

ArchiveX::~ArchiveX(void)
{
Close();
}

bool ArchiveX::IsLoading() const
{
if (AM_UNKNOWN == m_nMode)
{
return false;
}
return (AM_Loading == m_nMode);
}

bool ArchiveX::IsStoring() const
{
if (AM_UNKNOWN == m_nMode)
{
return false;
}
return (AM_Storing == m_nMode);
}

void ArchiveX::Flush()
{
if (m_File.is_open())
{
m_File.flush();
}
}

void ArchiveX::Close()
{
if (m_File.is_open())
{
if (AM_Storing == m_nMode)
{
m_File.flush();
}
m_File.close();
}
}

ArchiveX & ArchiveX::operator<<( bool b )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&b,sizeof(bool));
return (*this);
}

ArchiveX & ArchiveX::operator<<( char ch )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&ch,sizeof(char));
return (*this);
}

ArchiveX & ArchiveX::operator<<( unsigned char uch )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&uch,sizeof(unsigned char));
return (*this);
}

ArchiveX & ArchiveX::operator<<( short s )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&s,sizeof(short));
return (*this);
}

ArchiveX & ArchiveX::operator<<( unsigned short us )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&us,sizeof(unsigned short));
return (*this);
}

ArchiveX & ArchiveX::operator<<( int i )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&i,sizeof(int));
return (*this);
}

ArchiveX & ArchiveX::operator<<( unsigned int ui )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&ui,sizeof(unsigned int));
return (*this);
}

ArchiveX & ArchiveX::operator<<( long l )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&l,sizeof(long));
return (*this);
}

ArchiveX & ArchiveX::operator<<( unsigned long ul )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&ul,sizeof( unsigned long));
return (*this);
}

ArchiveX & ArchiveX::operator<<( float f )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&f,sizeof(float ));
return (*this);
}

ArchiveX & ArchiveX::operator<<( double d )
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write((void*)&d,sizeof(double));
return (*this);
}

ArchiveX & ArchiveX::operator<<(const string& str)
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
Write(str.c_str(),str.length()+1);//直接多写一个字符
return (*this);
}

ArchiveX & ArchiveX::operator<<(const wstring & str)
{
if (AM_UNKNOWN == m_nMode)
{
return (*this);
}
// string strtemp=YangJing::Unicode2ANSI(str);
// Write(strtemp.c_str(),strtemp.length()+1);//直接多写一个字符
return (*this);
}
ArchiveX & ArchiveX::operator>>( bool & b )
{
Read(&b,sizeof(bool));
return (*this);
}

ArchiveX & ArchiveX::operator>>( char & ch )
{
Read(&ch,sizeof(char));
return (*this);
}

ArchiveX & ArchiveX::operator>>( unsigned char & uch )
{
Read(&uch,sizeof(unsigned char));
return (*this);
}

ArchiveX & ArchiveX::operator>>( short & s )
{
Read(&s,sizeof(short));
return (*this);
}

ArchiveX & ArchiveX::operator>>( unsigned short & us )
{
Read(&us,sizeof(unsigned short));
return (*this);
}

ArchiveX & ArchiveX::operator>>( int & i )
{
Read(&i,sizeof(int));
return (*this);
}

ArchiveX & ArchiveX::operator>>( unsigned int & ui )
{
Read(&ui,sizeof(unsigned int));
return (*this);
}

ArchiveX & ArchiveX::operator>>( long & l )
{
Read(&l,sizeof(long));
return (*this);
}

ArchiveX & ArchiveX::operator>>( unsigned long & ul )
{
Read(&ul,sizeof(unsigned long));
return (*this);
}

ArchiveX & ArchiveX::operator>>( float & f )
{
Read(&f,sizeof(float));
return (*this);
}

ArchiveX & ArchiveX::operator>>( double & d )
{
Read(&d,sizeof(double));
return (*this);
}

ArchiveX & ArchiveX::operator>>( string & str )
{
str="";
char ch;
Read(&ch,1);
while (ch!='\0')
{
str.append(1,ch);
Read(&ch,1);
}
return (*this);
}

ArchiveX & ArchiveX::operator>>(wstring & str)
{
str=L"";
string strtemp="";
char ch;
Read(&ch,1);
while (ch!='\0')
{
strtemp.append(1,ch);
Read(&ch,1);
}
// str = YangJing::ANSI2Unicode(strtemp);

return (*this);
}

unsigned int ArchiveX::Read( void* lpBuf, unsigned int nMax )
{
if (AM_UNKNOWN == m_nMode)
{
return 0;
}
m_File.read((char*)lpBuf,nMax);
if (m_File.good())
{
return nMax;
}
return 0;
}

unsigned int ArchiveX::Write( const void* lpBuf,unsigned int nMax )
{
if (AM_UNKNOWN == m_nMode)
{
return 0;
}
m_File.write((char*)lpBuf,nMax);
if (m_File.good())
{
return nMax;
}
return 0;
}

bool ArchiveX::IsBufferEmpty()
{
if (AM_UNKNOWN == m_nMode)
{
return false;
}
return m_File.eof();
}





int main()
{
ArchiveX ar;
ar.open("hkx.dat", AM_Storing);
string str = "hekexin";
ar << 100;
ar << str;
ar << 1.2345;
ar.Close();

ar.open("hkx.dat", AM_Loading);
int val;
std::string str1;
double dVal;
ar >> val;
ar >> str1;
ar >> dVal;

ar.Close();

std::cout<<val<<std::endl;
std::cout<<str1<<std::endl;
std::cout<<dVal<<std::endl;

return 0;
}