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

简介: 原创作者:岳东卫转载请写明 半夜突然兴起,于是乎有敲起了代码(哎!明早上又要旷课了 。。。): 我们用到过很多的对象序列化的,我在保存数据 传输数据的时候经常用到..用的多了 就想考虑下 像MFC  以及 java  和 boost库中他们到底是如何来实现序列化的  。

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

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

我们用到过很多的对象序列化的,我在保存数据 传输数据的时候经常用到..用的多了 就想考虑下 像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 ;
}


 

目录
打赏
0
0
0
0
8
分享
相关文章
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
206 68
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
2月前
|
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
74 19
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
63 13
什么是内存泄漏?C++中如何检测和解决?
大家好,我是V哥。内存泄露是编程中的常见问题,可能导致程序崩溃。特别是在金三银四跳槽季,面试官常问此问题。本文将探讨内存泄露的定义、危害、检测方法及解决策略,帮助你掌握这一关键知识点。通过学习如何正确管理内存、使用智能指针和RAII原则,避免内存泄露,提升代码健壮性。同时,了解常见的内存泄露场景,如忘记释放内存、异常处理不当等,确保在面试中不被秒杀。最后,预祝大家新的一年工作顺利,涨薪多多!关注威哥爱编程,一起成为更好的程序员。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等