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

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

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

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

对象的序列化规则 不同的语言 不一样 ,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<

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();   //读取序列化对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值