您的位置:首页 > 编程语言 > C语言/C++

C++序列化模拟三 -----酒后日志

2012-06-16 23:05 162 查看
四级考试实在是郁闷于是,出去喝酒 ,今天喝酒喝多了,中午的时候解决了上次的BUG2 ....
浑身已经,麻木,,,,代码贴下,,我决定以对象序列化研究作为我的毕业设计,抽出一定时间研究最后整合.昨天我的BUG2原因是由于没有对基类进行序列化 ////
关于BUG1的问题 设计到new 的内存分配机制以及对内存的映射问题// ,下次在研究今天实在敲不动代码了 喝了三大扎扎啤睡觉了....../////
BUG1解决方案如下
ObjectSerialize.h 头文件
#include <iostream>

#include <fstream>

#include <string>

using namespace std ;

#ifndef _ONE

#define _ONE

class Base //基类做一些统一的操作

{



};

class ObjectSerialize

{

public:

/* Base类型提供了统一的实现 ,所有需要序列化的类必须继承自Base类 包括成员对象

* LoadObject LoadObject 在这里不需要多态机制 单独作为功能的实现

* length 为对象的实际长度 为了避免在内存重分配过多的内存浪费空间

* long length=sizeof(*obj) ; //不可以这样做因为 我们发现实际上sizeof这个运算符

* 在操作的时候获取的是当前运行时类型所指对象的大小 如果向上转型那么会进行窄化处理 获得的大小是1 所以这里要传递实际大小

* LoadObject LoadObject作为Base的静态方法分别提供序列化和反序列化的功能

*/

static void StoreObject(Base *obj,string file,int length) ;

static Base* LoadObject(string file,int length) ;

ObjectSerialize() ;

private:

/*

* 暂存加载的对象,对于同一个对象无论LoadObject多少次 加载的永远只是

* 返回的同一份内存即同一个对象,直到这个对象的声明周期完毕,那么再次加载会是不同的对象

*/

static Base *tem_object;

} ;

#endif
ObjectSerialize.cpp内容如下
#include "ObjectSerialize.h"
void ObjectSerialize::StoreObject(Base *obj,string file,int length)

{

cout<<"对象写入到文件..."<<endl ;

ofstream *o=new ofstream(file.c_str()) ;

o->write((char*)obj,length) ;

o->close() ;

delete o ;

}

Base* ObjectSerialize::LoadObject(string file,int length)

{

cout<<"从文件恢复对象..."<<endl ;

if(ObjectSerialize::tem_object!=NULL)

return ObjectSerialize::tem_object ;

char *buf=new char[length] ;

ifstream i(file.c_str()) ;

i>>buf ;

Base *p=(Base*)buf ;

ObjectSerialize::tem_object=p ;

i.close() ;

return (p);

}

ObjectSerialize::ObjectSerialize()

{

delete ObjectSerialize::tem_object ;

ObjectSerialize::tem_object=NULL ;

}

Base* ObjectSerialize::tem_object=NULL;

//对于静态成员我们不能在一个文件中定义 否则将会导致重复定义

//我们需要在源文件中实现

///main所在的文件代码如下
#include "ObjectSerialize.h"

class Data :public Base

{

private :

int data ;

public:

Data(int x)

{

cout<<"Data构造中..."<<endl ;

this->data=x;

}

void OutPut()

{

cout<<"Data.data="<<this->data<<endl ;

}

} ;

//序列化类MyObject

class MyObject :public Base

{

public :

MyObject(int x)

{

cout<<"MyObject 构造中.."<<endl;

this->x=x ;

y=8 ;



}

~MyObject()

{

}



MyObject ShowX() //一段最简单的代码

{

cout<<"x="<<x<<endl ;

cout<<"y="<<y<<endl ;

return (*this) ;

}



private :

int x ;

int y ;

} ;

struct X :public Base

{

int a;

int b;

int c;



} ;
int main()

{

string file1="c:\\data.txt" ;

string file2="c:\\myobject.txt" ;

int len1=sizeof(Data) ;

int len2=sizeof(MyObject) ;
// Data *d=new Data(432);

// ObjectSerialize::StoreObject(d,file1,len1) ;

// MyObject *obj=new MyObject(4333) ;

// ObjectSerialize::StoreObject(obj,file2,len2) ;

//((Data*)ObjectSerialize::LoadObject(file1,len1))->OutPut() ;

((Data*)ObjectSerialize::LoadObject(file2,len2))->OutPut() ;
return 0 ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: