MFC ActiveX 控件:序列化
本文讨论如何序列化 Activex 控件。 序列化是读取或写入定向到一个永久性存储中,如磁盘文件。 Microsoft 基础类 (MFC)库提供内置为类 CObject的序列化支持。 COleControl 扩展此支持对 Activex 控件使用属性交换机制。
Activex 控件的序列化通过重写的 COleControl_Double_Colon_DoPropExchange实现。 此功能,调用控件的对象的加载和保存过程中,存储所有属性实现与变量成员或与更改通知的成员变量。
下面的主题包括的主要问题与序列化 Activex 控件:
实现 DoPropExchange请函数序列化控件对象
自定义序列化进程
实现版本支持
实现 DoPropExchange 功能
当您使用 Activex 控件向导生成控件项目时,多个默认处理程序函数会自动添加到控件类,包括 COleControl_Double_Colon_DoPropExchange的默认实现。 下面的示例演示代码添加到使用 Activex 控件向导创建的类:
void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
如果要使属性不可变,请通过将调用修改 DoPropExchange 到属性交换功能。 下面的示例演示一个自定义布尔 CircleShape 属性的序列化, CircleShape 属性具有 TRUE的默认:
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}
下表列出了可用于序列化控件的属性的属性交换功能:
属性交换函数 |
用途 |
---|---|
PX_Blob () |
序列化一个类型二进制大对象 (BLOB)数据特性。 |
PX_Bool () |
序列化一个类型布尔属性。 |
PX_Color () |
序列化一个类型颜色属性。 |
PX_Currency () |
序列化一个类型 CY (资金) 属性。 |
PX_Double () |
序列化一个类型 双线 属性。 |
PX_Font () |
序列化一个字体类型的属性。 |
PX_Float () |
序列化一个类型 float 属性。 |
PX_IUnknown () |
序列化类型 LPUNKNOWN属性。 |
PX_Long () |
序列化一个类型 long 属性。 |
PX_Picture () |
序列化一个类型图片属性。 |
PX_Short () |
序列化一个类型 不足 属性。 |
PX_String () |
序列化一个类型 CString 属性。 |
PX_ULong () |
序列化一个类型 ULONG 属性。 |
PX_UShort () |
序列化一个类型 USHORT 属性。 |
有关这些属性交换功能的更多信息,请参见 MFC 引用 中的 OLE 控件持久性。
自定义 DoPropExchange 默认行为
DoPropertyExchange 的默认实现 (如上一代主题所示) 仅仅是对基类 COleControl。 此序列化 COleControl自动支持的属性,比序列化只有控件的自定义属性使用更多的存储空间。 移除此调用允许您的对象序列化您认为重要的那些属性。 所有股票属性指示控件实现了不会序列化,在保存或加载控件对象,除非您显式添加 PX_ 时需要它们。
实现版本支持
版本支持可修改后的 Activex 控件添加新的持久性的属性和仍可以检测和加载该控件的早期版本创建一个持久状态。 若要使控件的版本可用作为其持久性数据的一部分,调用控件的 DoPropExchange 功能的 COleControl_Double_Colon_ExchangeVersion 。 使用 Activex 控件向导,,因此,如果 Activex 控件中创建了调用会自动插入。 它,如果版本支持不是必需的,可以移除。 但是,在控件大小的成本的版本所提供的添加的灵活性非常少 (4 个字节)。
如果控件的 Activex 控件向导未创建,请添加对的调用 COleControl_Double_Colon_ExchangeVersion 通过将以下代码行插入到您的 DoPropExchange 的开头 (在对 COleControl_Double_Colon_DoPropExchange的调用之前):
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
}
可以使用任何 DWORD 作为版本号。 Activex 控件向导使用生成的项目 _wVerMinor 和 _wVerMajor 为默认值。 这些是项目的 Activex 控件类实现文件定义的全局常数。 在您的 DoPropExchange 函数中的其余部分,您可以随时调用 CPropExchange_Double_Colon_GetVersion 检索您保存或检索的版本。
在下面的示例中,此示例控件的 1 版只能由一个 “ReleaseDate”属性。 版本 2 添加一个 “OriginalDate”属性。 如果控件被指示从旧版本加载持久状态,它初始化新特性的成员变量设置为默认值。
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Long(pPX, _T("ReleaseDate"), m_ReleaseDate);
if (pPX->GetVersion() >= MAKELONG(0, 2))
{
PX_Long(pPX, _T("OriginalDate"), m_OriginalDate);
}
else
{
if (pPX->IsLoading())
m_OriginalDate = 0;
}
...
}
默认情况下,控件 “转换”旧数据转换为最新的布局。 例如,在中,如果控件的版本 2 由 1 版保存的数据,它将编写版本 2 格式,则再次时保存。 如果希望控件保存数据格式为次读取,请通过 FALSE 为第三个参数,在调用 ExchangeVersion时。 默认情况下第三个参数是可选的是 TRUE 。