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

java与c++中的对象序列化 分析。

2012-04-06 13:09 316 查看
有时候我们在开发项目的时候,对于数据的保存 我们通常是直接将数据保存到磁盘上面 ,但是这样操作起来非常的不方便 ,尤其是在大型的项目开发中。 对象的序列化

可以将对象以数据的形式存储到文件中;反之我们也可以从文件中加载一个对象 ,也叫反序列化。

对于多个数据的操作封装在一起,写入文件,在反序列化的时候我们只需要读取这个对象就可以了 ,我么就不必关心内部数据和方法了 。因为所有数据都包含在对象中。

对象的序列化规则 不同的语言 不一样 ,java中有java的规则 ,c++中有自己的规则 。可以这样理解,他们将一个对象按某种规则转换成与机器指令对应的数据集,然后存储到文件中。反序列化的时候只需要按照规则解密,然后在内存中重构对象。

1、 java中的序列化 。

支持序列化的类必须实现 Serializable接口 ,这样他才可以被序列化 和反序列化 、。 下面是一个简单那的例子

Class A implements Serializable //定义可以序列化的类

{

public int a ;

public A(int x){this.a=a ;}

public void show()

{

System.out.println(a) ;

}

}

main方法添加如代码 :

序列化 :

A tem=new A() ;

FileOutputStream fos=new FileOutputStream("d:\\a.txt") ;

ObjectOutputStream oos=new ObjectOutputStream(fos) ;

oos.writeObject(tem) ;

反序列化:

FileInputStream fis=new FileInputStream("d:\\a.txt") ;

ObjectInputStream ois=new ObjectInputStream(fis) ;

A tem=(A)oos.readObjec()t;

2、

C++下的序列化 :

1、首先序列化的类必须从CObject派生

2、必须实现CObject的 Serialize 方法 使用CArchive::IsLoading or CArchive::IsStoring来决定是加载还是存储

3、 在类的定义部分添加DECLARE_SERIAL 宏 在实现部分定义IMPLEMENT_SERIAL 宏

4、CArchive::ReadObject and CArchive::WriteObject 来反序列化或者 序列化对象

代码如下:

类定义:

class MyObject :public CObject

{

public:

DECLARE_SERIAL(MyObject)

void Serialize(CArchive& ar);

void Show() ;

void SetValue(int a,int b) ;

int a ;

int b ;

};

IMPLEMENT_SERIAL(MyObject,CObject,5)

void MyObject::Serialize(CArchive& ar)

{

CObject::Serialize(ar);

if(ar.IsStoring())

ar<<a<<b;

else

ar>>b>>a;

}

void MyObject::Show()

{

CString str;

str.Format("%d%d",a,b) ;

MessageBox(NULL,str,"",MB_OK) ;

}

void MyObject::SetValue(int a,int b)

{

this->a=a ;

this->b=b ;

}

序列化示例:

MyObject obj ;

obj.SetValue(1,2) ;

CFile file("d:\\obj.txt",CFile::modeReadWrite|CFile::modeNoTruncate|CFile::modeCreate); //打开文件

CArchive arc(&file,CArchive::store) ; //将CArchive和 CFile类对象关联

arc.WriteObject(&obj) ; //向文件写入对象

反序列化示例:

MyObject obj ;

CFile file("d:\\obj.txt",CFile::modeRead); //加载文件

CArchive arc(&file,CArchive::load) ; //定义CArchive和CFile关联

((MyObject*)arc.ReadObject(obj.GetRuntimeClass()))->Show(); //读取序列化对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: