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


    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;
    }
    

      

  • 相关阅读:
    几个常见的在线评测系统,及我的点评
    信息学奥赛培训教材推荐
    致,青春
    文明小博客,管理员及网址列表
    NOIP2013,复赛及同步赛,报名及比赛,专题页面
    浅谈浏览器兼容性问题-(1)产生、看待与思考
    前端经典笔试题(腾讯前端,三栏布局)
    浅谈web语义化
    浅谈表现与数据分离
    浅谈w3c标准
  • 原文地址:https://www.cnblogs.com/kex1n/p/2254764.html
Copyright © 2020-2023  润新知