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

来源:互联网 发布:构架师和程序员 编辑:程序博客网 时间:2024/06/07 08:02
可以实现对象的存储到本地机器以及从文件加载对象而不用任何的库来辅助 、  下面开始 :

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

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

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

[cpp] view plaincopyprint?
  1. #include <iostream>   
  2. #include <fstream>   
  3. #include <string>   
  4. using  namespace std ;  
  5. template <class T>   
  6. class MyObject  
  7. {   
  8. public :  
  9.      MyObject(T x)  
  10.      {    
  11.         cout<<"对象构造中!"<<endl ;  
  12.         this->x=x ;  
  13.              }  
  14.      ~MyObject()  
  15.      {  
  16.      }  
  17.      static  void StoreObject(MyObject *obj)  
  18.      {  
  19.         long length=sizeof(*obj) ;  
  20.         ofstream *o=new ofstream("c:\\obj.xxx") ;  
  21.         o->write((char*)obj,length) ;  
  22.         o->close() ;  
  23.         delete o ;  
  24.      }  
  25.      static MyObject LoadObject(string file)  
  26.      {  
  27.          char buf[1000] ;  
  28.          ifstream i(file.c_str()) ;  
  29.          i>>buf ;  
  30.           MyObject *p=(MyObject*)buf ;  
  31.          i.close() ;  
  32.          return (*p);  
  33.      }  
  34.     MyObject ShowX()  //一段最简单的代码   
  35.     {  
  36.      cout<<"x="<<x<<endl ;  
  37.      return (*this) ;  
  38.     }  
  39.   
  40. private :  
  41.     int x ;  
  42. }  ;  
  43.   
  44. int main()  
  45. {     
  46.     MyObject<int> obj(443);  
  47.     MyObject<int>::StoreObject(&obj) ;  
  48.     MyObject<int>::LoadObject("c:\\obj.xxx").ShowX();  
  49.     return 0 ;  
  50. }  


紧接着问题由来了,的确上面的代码可以实现简单对象的序列化但是,,当类的成员是另一个类的实例的时候,那么又应该怎么弄呢? 再运行下面代码发现 ,程序在序列化到文件的时候崩溃了...什么原因呢 。。这根我们在java中和MFC对于成员对象序列化一样,在java中如果成员对象没有实现Serializable接口那么那么就会抛出一个异常 ,

在MFC中如果不成员对象所在的类如果不从CObject派生以及 增加一些宏定义那么也会程序崩溃。。看下面代码在上面代码修改后就出现了问题。程序就会崩溃。。。 

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

[cpp] view plaincopyprint?
  1. #include <iostream>   
  2. #include <fstream>   
  3. #include <string>   
  4. using  namespace std ;  
  5. class Data  
  6. {  
  7.      public:  
  8.        void OutPut()  
  9.        {  
  10.            cout<<"输出成员对象!"<<endl ;  
  11.        }  
  12. } ;  
  13. template <class T>   
  14. class MyObject  
  15. {   
  16. public :  
  17.      MyObject(T x)  
  18.      {    
  19.          cout<<"对象构造中!"<<endl ;  
  20.         this->x=x ;  
  21.           
  22.         dt=new Data() ;  
  23.      }  
  24.      ~MyObject()  
  25.      {  
  26.          delete dt ;  
  27.      }  
  28.      static  void StoreObject(MyObject *obj)  
  29.      {  
  30.         long length=sizeof(*obj) ;  
  31.         ofstream *o=new ofstream("c:\\obj.xxx") ;  
  32.         o->write((char*)obj,length) ;  
  33.         o->close() ;  
  34.         delete o ;  
  35.      }  
  36.      static MyObject LoadObject(string file)  
  37.      {  
  38.          char buf[1000] ;  
  39.          ifstream i(file.c_str()) ;  
  40.          i>>buf ;  
  41.           MyObject *p=(MyObject*)buf ;  
  42.          i.close() ;  
  43.          return (*p);  
  44.      }  
  45.     MyObject ShowX()  //一段最简单的代码  
  46.     {  
  47.      cout<<"x="<<x<<endl ;  
  48.      return (*this) ;  
  49.     }  
  50.   
  51. private :  
  52.     int x ;  
  53.     Data *dt;  
  54. }  ;  
  55.   
  56. int main()  
  57. {     
  58.     MyObject<int> obj(443);  
  59.     MyObject<int>::StoreObject(&obj) ;  
  60.     MyObject<int>::LoadObject("c:\\obj.xxx").ShowX();  
  61.     return 0 ;  
  62. }  
原创粉丝点击