Writing Serializable Classes---定义可序列化的类

简介: Writing Serializable Classes 定义可序列化的类 尽管MFC的CFile类使文件的读写变得相当容易,但是通常MFC程序都不直接使用CFile对象。相反地,他们使用CArchive类来实现文件的读写,CArchive类最终还是通过CFile类来实现文件输入/输出。

 

Writing Serializable Classes

定义可序列化的类

尽管MFCCFile类使文件的读写变得相当容易,但是通常MFC程序都不直接使用CFile对象。相反地,他们使用CArchive类来实现文件的读写,CArchive类最终还是通过CFile类来实现文件输入/输出。MFC得载了 <<>> 操作符来实现数据的进、出,主要是因为程序通常也是将数据存入或将数据取出。

SerializationMFC中一个重要概念,因为他是MFC在文档/视的程序中实现打开和保存文件的基础。

定义可序列化的类

一个对象若要支持可序列化,它必须是可序列化类的实例。定义一个可序列化的类分为以下五步:

  1. 使该类直接或间接继承类CObject
  2. 在类声明中包含MFC的宏DECLARE_SERIALDECLARE_SERIAL只要一个参数:类名;
  3. 重载基类的Serialize函数,并序列化继承类的成员数据;
  4. 若继承类没有默认构造函数,添加之。这步是必须的,因为当一个对象载入时,MFC使用默认构造函数创建一个对象,并用文件中的数据来初始化对象的成员函数;
  5. 在类的实现中包含MFC的宏IMPLEMENT_SERIAL。宏IMPLEMENT_SERIAL需要三个参数:类名、基类名和模式号(schema number)。模式号是一个整数,表示一个版本号。

实例

假设你定义了一个类CLine来表示直线,类有两个CPoint的成员变量来存储直线的端点,你想使这个类支持序列化。原始的类声明如下:

   1:  class CLine
   2:  {
   3:  protected:
   4:      CPoint m_ptFrom;
   5:      CPoint m_ptTo;
   6:   
   7:  public:
   8:      CLine (CPoint from, CPoint to) { m_ptFrom = from; m_ptTo = to; }
   9:  };

使该类支持序列化很容易,如下代码为添加序列化功能的类声明:

   1:  class CLine : public CObject
   2:  {
   3:  DECLARE_SERIAL (CLine)
   4:   
   5:  protected:
   6:      CPoint m_ptFrom;
   7:      CPoint m_ptTo;
   8:   
   9:  public:
  10:      CLine () {} // Required!
  11:      CLine (CPoint from, CPoint to) { m_ptFrom = from; m_ptTo = to; }
  12:      void Serialize (CArchive& ar);
  13:  };
  14:   

重载的序列化函数如下所示:

void CLine::Serialize (CArchive& ar)
{
    CObject::Serialize (ar);
    if (ar.IsStoring ())
        ar << m_ptFrom << m_ptTo;
    else // Loading, not storing
        ar >> m_ptFrom >> m_ptTo;
}
 

最后在类的实现文件中添加下面的宏即可:

   1:  IMPLEMENT_SERIAL (CLine, CObject, 1)

通过这些修改,这个类是完全支持可序列化的。

目录
相关文章
|
3月前
|
存储 Java
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
这篇文章介绍了Java中ObjectInputStream和ObjectOutputStream类的基本使用,这两个类用于实现对象的序列化和反序列化。文章解释了序列化的概念、如何通过实现Serializable接口来实现序列化,以及如何使用transient关键字标记不需要序列化的属性。接着,通过示例代码演示了如何使用ObjectOutputStream进行对象的序列化和ObjectInputStream进行反序列化。
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
|
3月前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
39 1
|
4月前
|
存储 安全 Java
揭秘Java序列化神器Serializable:一键解锁对象穿越时空的超能力,你的数据旅行不再受限,震撼登场!
【8月更文挑战第4天】Serializable是Java中的魔术钥匙,开启对象穿越时空的能力。作为序列化的核心,它让复杂对象的复制与传输变得简单。通过实现此接口,对象能被序列化成字节流,实现本地存储或网络传输,再通过反序列化恢复原状。尽管使用方便,但序列化过程耗时且存在安全风险,需谨慎使用。
51 7
|
5月前
|
存储 JSON 数据库
项目管理定义问题之什么是序列化大对象的值对象数据库形态
项目管理定义问题之什么是序列化大对象的值对象数据库形态
|
7月前
|
分布式计算 Java 大数据
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
102 0
|
6月前
|
存储 分布式计算 Hadoop
MapReduce编程模型——自定义序列化类实现多指标统计
MapReduce编程模型——自定义序列化类实现多指标统计
50 0
|
NoSQL Java Redis
[已解决]报异常java.io.InvalidClassException的解决方法|对象序列化实现Serializable会出现java.io.InvalidClassException的异常
[已解决]报异常java.io.InvalidClassException的解决方法|对象序列化实现Serializable会出现java.io.InvalidClassException的异常
|
7月前
|
缓存 Java 数据库
为什么Bean类要序列化?
为什么Bean类要序列化?
45 0
|
7月前
|
JSON API 网络架构
Python Web 开发: 解释 Django REST framework 的作用,以及如何定义序列化器(Serializer)?
Python Web 开发: 解释 Django REST framework 的作用,以及如何定义序列化器(Serializer)?
85 0
|
7月前
|
存储 Java Android开发
[Android]序列化原理Serializable
[Android]序列化原理Serializable
92 0