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(); //读取序列化对象
可以将对象以数据的形式存储到文件中;反之我们也可以从文件中加载一个对象 ,也叫反序列化。
对于多个数据的操作封装在一起,写入文件,在反序列化的时候我们只需要读取这个对象就可以了 ,我么就不必关心内部数据和方法了 。因为所有数据都包含在对象中。
对象的序列化规则 不同的语言 不一样 ,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(); //读取序列化对象
相关文章推荐
- java与c++中的对象序列化分析
- java与c++中的对象序列化 分析。
- java与c++中的对象序列化 分析。
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系 (一)
- 实例分析java对象的序列化和反序列化
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系(二)
- 【JSE】Java与C++对象不同之处分析
- java对象序列化示例
- Java学习之对象序列化(二)
- Java对象序列化给分布式计算带来的方便
- 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题
- java对象序列化学习笔记
- Java和C++通过new创建的对象有何区别?
- java 复制对象 (克隆接口 与 序列化)
- java对象与字符串之间的序列化和反序列化
- 关于Java对象复制(Clone、深度Clone以及序列化与反序列化的使用)
- Java基础学习总结——Java对象的序列化和反序列化
- 使用 JID 来进行 Java 对象的高性能序列化
- Java IO详解(六)------序列化与反序列化(对象流)
- Java基础学习总结——Java对象的序列化和反序列化