有时候我们在开发项目的时候,对于数据的保存 我们通常是直接将数据保存到磁盘上面 ,但是这样操作起来非常的不方便 ,尤其是在大型的项目开发中。 对象的序列化
可以将对象以数据的形式存储到文件中;反之我们也可以从文件中加载一个对象 ,也叫反序列化。
对于多个数据的操作封装在一起,写入文件,在反序列化的时候我们只需要读取这个对象就可以了 ,我么就不必关心内部数据和方法了 。因为所有数据都包含在对象中。
对象的序列化规则 不同的语言 不一样 ,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(); //读取序列化对象