缓存数据

可以在文档级自定义项中缓存数据对象,以便脱机访问数据,或者无需打开 Microsoft 办公室 Word 或 Microsoft 办公室 Excel。 若要缓存对象,该对象必须具有满足特定要求的数据类型。 .NET Framework 中的许多常见数据类型都满足这些要求,包括StringDataSetDataTable

适用于: 本主题中的信息适用于 Excel 和 Word 的文档级项目。 有关详细信息,请参阅办公室应用程序和项目类型提供的功能。

可通过两种方法将对象添加到数据缓存:

要缓存的数据对象的要求

若要在解决方案中缓存数据对象,该对象必须满足以下要求:

  • 是宿主项(如 ThisDocument 或类)的读/写公共字段或 ThisWorkbook 属性。

  • 不是索引器或其他参数化属性。

    此外,数据对象必须由类序列化 XmlSerializer ,这意味着对象的类型必须具有以下特征:

  • 为公共类型。

  • 没有参数的公共构造函数。

  • 不执行需要其他安全权限的代码。

  • 仅公开读/写公共属性(将忽略其他属性)。

  • 不公开多维数组(接受嵌套数组)。

  • 不从属性和字段返回接口。

  • 如果集合未实现,则不实现 IDictionary

    缓存数据对象时,用于办公室运行时的 Visual Studio Tools 将对象序列化为存储在文档中自定义 XML 部件中的 XML 字符串。 有关详细信息,请参阅 自定义 XML 部件概述

缓存的数据大小限制

可以向文档中的数据缓存添加的数据总量以及数据缓存中任何单个对象的大小有一些限制。 如果超出这些限制,当数据保存到数据缓存时,应用程序可能会意外关闭。

若要避免这些限制,请遵循以下准则:

  • 不要将大于 10 MB 的任何对象添加到数据缓存中。

  • 不要将超过 100 MB 的总数据添加到单个文档中的数据缓存中。

    这些是近似值。 确切的限制取决于几个因素,包括可用的 RAM 和正在运行的进程数。

控制缓存对象的行为

若要更好地控制缓存对象的行为,可以在缓存对象的类型上实现 ICachedType 接口。 例如,如果要控制在对象更改时如何通知用户,则可以实现此接口。 有关演示如何实现ICachedType的代码示例,请参阅ControlCollection办公室开发示例和演练中的 Excel 动态控件示例和 Word 动态控件示例中的类。

在受密码保护的文档中保留对缓存数据的更改

如果在使用密码保护的文档中缓存数据对象,则不会保存对缓存数据的更改。 可以通过重写两种方法来保存对缓存数据的更改。 重写这些方法以在保存文档时暂时删除保护,然后在保存操作完成后重新应用保护。

有关详细信息,请参阅 如何:在受密码保护的文档中缓存数据。

在向数据缓存添加 null 值时防止数据丢失

向数据缓存添加对象时,在保存和关闭文档之前,必须将所有缓存的对象初始化为非 null 值。 如果保存和关闭文档时任何缓存对象具有 null 值,则用于办公室运行时的 Visual Studio Tools 将自动从数据缓存中删除所有缓存对象。

如果在设计时使用CachedAttribute属性向数据缓存添加值为 null 值的对象,则可以使用ServerDocument类在打开文档之前初始化缓存的数据对象。 如果要在未安装 Word 或 Excel 的服务器上初始化缓存的数据,那么在最终用户打开文档之前,这非常有用。 有关详细信息,请参阅 服务器上的文档中的访问数据。