Nah it's not so bad using CArchive, have a look at this basic 'Serializable' class
// derive from
class CNamedHandle: public CObject
{
private:
CString m_name;
AcDbHandle m_handle;
protected:
DECLARE_SERIAL(CNamedHandle)//<------------ need this
public:
CNamedHandle( void );
CNamedHandle( const CNamedHandle &src );
CNamedHandle( const CString &dwgName,const AcDbHandle &handle );
virtual ~CNamedHandle( void );
CNamedHandle& operator=( const CNamedHandle& rhs );
bool operator==( const CNamedHandle& rhs ) const;
bool operator!=( const CNamedHandle& rhs ) const;
virtual bool Equals( const CNamedHandle& rhs ) const;
virtual void Serialize( CArchive &ar );//<------------ need this
virtual CString ToString( void ) const;
AcDbHandle getHandle( void ) const;
void setHandle(const AcDbHandle &val);
CString getDwgName( void ) const;
void setDwgName(const CString &val);
__declspec( property(get=getHandle,put=setHandle) )AcDbHandle Handle;
__declspec( property(get=getDwgName,put=setDwgName) )CString DwgName;
};
#include "StdAfx.h"
#include "NamedHandle.h"
//***** need this ********//
IMPLEMENT_SERIAL( CNamedHandle, CObject, VERSIONABLE_SCHEMA|1)
CNamedHandle::CNamedHandle(void)
: m_name(),m_handle(){}
CNamedHandle::CNamedHandle( const CNamedHandle &src )
: m_name(),m_handle(){}
CNamedHandle::CNamedHandle( const CString &dwgName, const AcDbHandle &handle )
: m_name(dwgName),m_handle(handle){}
CNamedHandle::~CNamedHandle(void){}
CNamedHandle& CNamedHandle::operator=( const CNamedHandle& rhs )
{
if(this != &rhs)
{
m_name = rhs.m_name;
m_handle = rhs.m_handle;
}
return *this;
}
bool CNamedHandle::operator==( const CNamedHandle& rhs ) const
{
return Equals(rhs);
}
bool CNamedHandle::operator!=( const CNamedHandle& rhs ) const
{
return !Equals(rhs);
}
bool CNamedHandle::Equals( const CNamedHandle& rhs ) const
{
return (this->m_name == rhs.m_name &&
this->m_handle == rhs.m_handle);
}
void CNamedHandle::Serialize( CArchive &ar ) // <------------ Need this
{
CObject::Serialize( ar );
// data out
if (ar.IsStoring())
{
ar << m_name;
ar << (__int64)m_handle;
}
//data in
else
{
ar >> m_name;
ar >> (__int64&)m_handle;
}
}
CString CNamedHandle::ToString( void )const
{
CString str;
str.Format(_T("(%s, %I64d)"),m_name,(__int64)m_handle);
return str;
}
AcDbHandle CNamedHandle::getHandle( void ) const
{
return m_handle;
}
void CNamedHandle::setHandle( const AcDbHandle &val )
{
m_handle = val;
}
CString CNamedHandle::getDwgName( void ) const
{
return m_name;
}
void CNamedHandle::setDwgName( const CString &val )
{
m_name = val;
}
then I just need to call CNamedHandle::Serialize done !