以C++为例子,通过操作内存模拟实现对象的持久化存储(一)

原创作者:岳东卫转载请写明

半夜突然兴起,于是乎有敲起了代码(哎!明早上又要旷课了 。。。):

我们用到过很多的对象序列化的,我在保存数据 传输数据的时候经常用到..用的多了 就想考虑下 像MFC  以及 java  和 boost库中他们到底是如何来实现序列化的  。

最近我在thiking in java的时候,遇到了Scanner类的具体使用.这个类可以从一个实现了Readable接口的类的对象中读取 数据,刚好我最近给我同学做的一个小的信息管理系统用到了对象的序列化 ,于是我就想自己覆盖这个类来实现可以从一个文件存储N个对象,以及从一个文件加载N个对象 ,  于是兴奋的动手开始做了。折腾了半天只能实现一个对象的读取,郁闷,看了Scanner这个类的源代码发现 Sun就是用来处理文本数据的 ,复用这个类来读取多个对象似乎不大可能 。。。没有复用的必要。。。于是我想自己写一个可以实现对象的存储到本地机器以及从文件加载对象而不用任何的库来辅助 、  下面开始 :

    我的思路是内存,因为我们知道我们所有的数据都是存储在内存中的二进制数据 。 那么可以知道 我们的程序中的类的对象在运行过程中也相应的在他进城的存储

空间中对应一段二进制数据,那么我们是否可以将这个数据保存到本地然后从本地加载,我就兴奋的去尝试了,下 果然可以....原来对象序列化的原理是如此简单:

说道这里下面代码只完成了 简单的包含基本数据类型和方法的类进行序列化 ...经验证可以实现简单序列化 。。。

#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派生以及 增加一些宏定义那么也会程序崩溃。。看下面代码在上面代码修改后就出现了问题。程序就会崩溃。。。 

对于类内部的成员对象如何进行进一步的一层一层的序列化呢?这个问题麻烦了..... 下次在继续 睡觉 。。。

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


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UsherYue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值