且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-08-13 08:06:02

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

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

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

对象的序列化规则 不同的语言 不一样 ,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();   //读取序列化对象