在进行数据处理过程中,通常可能存在多个步骤,每个步骤都会产生一种新的中间数据格式,通常我们会将这些中间数据序列化后保存至缓存文件中,在后续步骤中再反序列化之拿来使用,这样使得数据的处理更加有层次感.
1.c++中的序列化和反序列化
通常我们都采用重载CObject类的Serialize方法结合CArchive类来实现.
1)创建一个Test类:
Test.h:
class CTest : public CObject { public: CTest(void); DECLARE_SERIAL(CTest) CTest(int a,double b); ~CTest(void); void Serialize(CArchive& ar); private: int m_nNum; double m_dNum; };Test.cpp:
#include "Test.h" IMPLEMENT_SERIAL(CTest, CObject, 1) CTest::CTest(void):m_nNum(100),m_dNum(1000.2) { } CTest::CTest(int a,double b):m_nNum(a),m_dNum(b) { } CTest::~CTest(void) { } void CTest::Serialize(CArchive &ar) { if(ar.IsStoring()) { ar << m_dNum; ar << m_nNum; } else { ar >> m_dNum; ar >> m_nNum; } }2)序列化和反序列化
CTest* pTest = new CTest(1000,2000); CFile fe; //写出 if(fe.Open(_T("D:\\rrrr.txt"),CFile::typeBinary | CFile::modeWrite)) { CArchive ar(&fe,CArchive::store); ar<<pTest; } fe.Close(); //读入 if(fe.Open(_T("D:\\rrrr.txt"),CFile::typeBinary | CFile::modeRead)) { CArchive ar(&fe,CArchive::load); CTest *pNewTest = NULL; ar>>pNewTest; }
序列化的类必须实现Serializable接口,通过ObjectOutputStream和ObjectInputStream实现写出和读入.
1)类的创建:
public class testSerial implements Serializable{ static final long serialVersionUID = 1L;//序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性 public int a = 100; public double b = 100.20; }
2)序列化和反序列化:
//写入 FileOutputStream fs = new FileOutputStream("D:\\testt.txt"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(ts); os.close(); //读取 FileInputStream fsIn = new FileInputStream("D:\\testt.txt"); ObjectInputStream osIn = new ObjectInputStream(fsIn); testSerial ts1 = (testSerial)osIn.readObject(); osIn.close();