以C++为例子,通过操作内存模拟实现对象的持久化存储(一)
2012-12-18 19:59
471 查看
可以实现对象的存储到本地机器以及从文件加载对象而不用任何的库来辅助 、 下面开始 :
我的思路是内存,因为我们知道我们所有的数据都是存储在内存中的二进制数据 。 那么可以知道 我们的程序中的类的对象在运行过程中也相应的在他进城的存储
空间中对应一段二进制数据,那么我们是否可以将这个数据保存到本地然后从本地加载,我就兴奋的去尝试了,下 果然可以....原来对象序列化的原理是如此简单:
说道这里下面代码只完成了 简单的包含基本数据类型和方法的类进行序列化 ...经验证可以实现简单序列化 。。。
[cpp]
view plaincopyprint?
#include <iostream>
#include <fstream>
#include <string>
using namespace std ;
template <class T>
class MyObject
{
public :
MyObject(T x)
{
cout<<"对象构造中!"<<endl ;
this->x=x ;
}
~MyObject()
{
}
static void StoreObject(MyObject *obj)
{
long length=sizeof(*obj) ;
ofstream *o=new ofstream("c:\\obj.xxx") ;
o->write((char*)obj,length) ;
o->close() ;
delete o ;
}
static MyObject LoadObject(string file)
{
char buf[1000] ;
ifstream i(file.c_str()) ;
i>>buf ;
MyObject *p=(MyObject*)buf ;
i.close() ;
return (*p);
}
MyObject ShowX() //一段最简单的代码
{
cout<<"x="<<x<<endl ;
return (*this) ;
}
private :
int x ;
} ;
int main()
{
MyObject<int> obj(443);
MyObject<int>::StoreObject(&obj) ;
MyObject<int>::LoadObject("c:\\obj.xxx").ShowX();
return 0 ;
}
紧接着问题由来了,的确上面的代码可以实现简单对象的序列化但是,,当类的成员是另一个类的实例的时候,那么又应该怎么弄呢? 再运行下面代码发现 ,程序在序列化到文件的时候崩溃了...什么原因呢 。。这根我们在java中和MFC对于成员对象序列化一样,在java中如果成员对象没有实现Serializable接口那么那么就会抛出一个异常 ,
在MFC中如果不成员对象所在的类如果不从CObject派生以及 增加一些宏定义那么也会程序崩溃。。看下面代码在上面代码修改后就出现了问题。程序就会崩溃。。。
对于类内部的成员对象如何进行进一步的一层一层的序列化呢?这个问题麻烦了..... 下次在继续 睡觉 。。。
[cpp]
view plaincopyprint?
#include <iostream>
#include <fstream>
#include <string>
using namespace std ;
class Data
{
public:
void OutPut()
{
cout<<"输出成员对象!"<<endl ;
}
} ;
template <class T>
class MyObject
{
public :
MyObject(T x)
{
cout<<"对象构造中!"<<endl ;
this->x=x ;
dt=new Data() ;
}
~MyObject()
{
delete dt ;
}
static void StoreObject(MyObject *obj)
{
long length=sizeof(*obj) ;
ofstream *o=new ofstream("c:\\obj.xxx") ;
o->write((char*)obj,length) ;
o->close() ;
delete o ;
}
static MyObject LoadObject(string file)
{
char buf[1000] ;
ifstream i(file.c_str()) ;
i>>buf ;
MyObject *p=(MyObject*)buf ;
i.close() ;
return (*p);
}
MyObject ShowX() //一段最简单的代码
{
cout<<"x="<<x<<endl ;
return (*this) ;
}
private :
int x ;
Data *dt;
} ;
int main()
{
MyObject<int> obj(443);
MyObject<int>::StoreObject(&obj) ;
MyObject<int>::LoadObject("c:\\obj.xxx").ShowX();
return 0 ;
}
我的思路是内存,因为我们知道我们所有的数据都是存储在内存中的二进制数据 。 那么可以知道 我们的程序中的类的对象在运行过程中也相应的在他进城的存储
空间中对应一段二进制数据,那么我们是否可以将这个数据保存到本地然后从本地加载,我就兴奋的去尝试了,下 果然可以....原来对象序列化的原理是如此简单:
说道这里下面代码只完成了 简单的包含基本数据类型和方法的类进行序列化 ...经验证可以实现简单序列化 。。。
[cpp]
view plaincopyprint?
#include <iostream>
#include <fstream>
#include <string>
using namespace std ;
template <class T>
class MyObject
{
public :
MyObject(T x)
{
cout<<"对象构造中!"<<endl ;
this->x=x ;
}
~MyObject()
{
}
static void StoreObject(MyObject *obj)
{
long length=sizeof(*obj) ;
ofstream *o=new ofstream("c:\\obj.xxx") ;
o->write((char*)obj,length) ;
o->close() ;
delete o ;
}
static MyObject LoadObject(string file)
{
char buf[1000] ;
ifstream i(file.c_str()) ;
i>>buf ;
MyObject *p=(MyObject*)buf ;
i.close() ;
return (*p);
}
MyObject ShowX() //一段最简单的代码
{
cout<<"x="<<x<<endl ;
return (*this) ;
}
private :
int x ;
} ;
int main()
{
MyObject<int> obj(443);
MyObject<int>::StoreObject(&obj) ;
MyObject<int>::LoadObject("c:\\obj.xxx").ShowX();
return 0 ;
}
#include <iostream> #include <fstream> #include <string> using namespace std ; template <class T> class MyObject { public : MyObject(T x) { cout<<"对象构造中!"<<endl ; this->x=x ; } ~MyObject() { } static void StoreObject(MyObject *obj) { long length=sizeof(*obj) ; ofstream *o=new ofstream("c:\\obj.xxx") ; o->write((char*)obj,length) ; o->close() ; delete o ; } static MyObject LoadObject(string file) { char buf[1000] ; ifstream i(file.c_str()) ; i>>buf ; MyObject *p=(MyObject*)buf ; i.close() ; return (*p); } MyObject ShowX() //一段最简单的代码 { cout<<"x="<<x<<endl ; return (*this) ; } private : int x ; } ; int main() { MyObject<int> obj(443); MyObject<int>::StoreObject(&obj) ; MyObject<int>::LoadObject("c:\\obj.xxx").ShowX(); return 0 ; }
紧接着问题由来了,的确上面的代码可以实现简单对象的序列化但是,,当类的成员是另一个类的实例的时候,那么又应该怎么弄呢? 再运行下面代码发现 ,程序在序列化到文件的时候崩溃了...什么原因呢 。。这根我们在java中和MFC对于成员对象序列化一样,在java中如果成员对象没有实现Serializable接口那么那么就会抛出一个异常 ,
在MFC中如果不成员对象所在的类如果不从CObject派生以及 增加一些宏定义那么也会程序崩溃。。看下面代码在上面代码修改后就出现了问题。程序就会崩溃。。。
对于类内部的成员对象如何进行进一步的一层一层的序列化呢?这个问题麻烦了..... 下次在继续 睡觉 。。。
[cpp]
view plaincopyprint?
#include <iostream>
#include <fstream>
#include <string>
using namespace std ;
class Data
{
public:
void OutPut()
{
cout<<"输出成员对象!"<<endl ;
}
} ;
template <class T>
class MyObject
{
public :
MyObject(T x)
{
cout<<"对象构造中!"<<endl ;
this->x=x ;
dt=new Data() ;
}
~MyObject()
{
delete dt ;
}
static void StoreObject(MyObject *obj)
{
long length=sizeof(*obj) ;
ofstream *o=new ofstream("c:\\obj.xxx") ;
o->write((char*)obj,length) ;
o->close() ;
delete o ;
}
static MyObject LoadObject(string file)
{
char buf[1000] ;
ifstream i(file.c_str()) ;
i>>buf ;
MyObject *p=(MyObject*)buf ;
i.close() ;
return (*p);
}
MyObject ShowX() //一段最简单的代码
{
cout<<"x="<<x<<endl ;
return (*this) ;
}
private :
int x ;
Data *dt;
} ;
int main()
{
MyObject<int> obj(443);
MyObject<int>::StoreObject(&obj) ;
MyObject<int>::LoadObject("c:\\obj.xxx").ShowX();
return 0 ;
}
相关文章推荐
- 以C++为例子,通过操作内存模拟实现对象的持久化存储(一)
- 以C++为例子,通过操作内存模拟实现对象的持久化存储(一)
- C++通过操作内存模拟序列化---实现多种类型的序列化(2)
- C++通过操作内存模拟序列化---实现多种类型的序列化(2)
- C++实现记录类型内存分配方式的包装类,使对象(或原始类型)只能通过new的方式实例化
- linux 文件操作函数 通过例子来解释 父子间文件描述符共享 内存映像图
- c#通过操作mongodb gridfs实现文件的数据库存储
- 通过例子学设计模式之--简单工厂模式以及使用场景说明(C++实现)
- 您希望通过将所有ArrayList对象替换为相应的泛型版本以提高应用程序的效率,并使得代码更易于使用。当结构体或其他值类型存储在这些数据结构中时,会导致装箱/拆箱操作,这时就需要这么做。
- [原创]一个通过BackgroundWorker实现WinForm异步操作的例子
- 使用C++链表来实现二叉树的存储和基本操作
- C++:通过一个点的数据对象转换成字符串的例子来说明整数转化为字符串
- C++对象布局及多态实现探索之内存布局
- Mercury.DeviceReplay对象实现鼠标、键盘模拟操作
- c++使用sendinput函数实现模拟键盘按键操作
- MongoDB入门(8)- c#通过操作MongoDB GridFS实现文件的数据库存储
- C++实现对象序列化和反虚拟化(读写二进制文件)操作
- [置顶] 从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector .
- C语言模拟C++方式读取串口操作实现
- 模拟实现str类函数和几个内存操作函数