# Persistent Property Sets

While the kind of run-time properties that Automation and ActiveX Controls offer are important, they do not directly address the need to store information with objects persistently stored in the file system. These entities could include files (structured, compound, etc.), directories, and summary catalogs. OLE provides both a standard serialized format for these persistent properties, and a set of interfaces and functions that allow you to create and manipulate the property sets and their properties.

Persistent properties are stored as sets, and one or more sets may be associated with a file system entity. These persistent property sets are intended to be used to store data that is suited to being represented as a collection of fine-grained values. They are not intended to be used as a large data base. They can be used to store summary information about an object on the system, which can then be accessed by any other object that understands how to interpret that property set.

Previous versions of OLE specified very little with respect to properties and their usage, but did define a serialized format that allowed developers to store properties and property sets in an IStorage instance. The property identifiers and semantics of a single property set, used for summary information about a document, was also defined. At that time, it was necessary to create and manipulate that structure directly as a data stream. For information on the property set serialized data format structure, refer to OLE Serialized Property Set Format.

Now, however, OLE defines two primary interfaces to manage property sets:

- IPropertyStorage

- IPropertySetStorage

It is no longer necessary to deal with the serialized format directly when these interfaces are implemented on an object that supports the IStorage interface (such as compound files). Writing properties through IPropertySetStorage and IPropertyStorage creates data that exactly conforms to the OLE property set format, as viewed through IStorage methods. The converse is also true&emdash;properties written to the OLE property set format using IStorage are visible through IPropertySetStorage and IPropertyStorage (although you cannot expect to write to IStream and have the properties through IPropertyStorage immediately available, or vice versa).

The IPropertySetStorage interface defines methods that create and manage property sets. The IPropertyStorage interface directly manipulates the properties within a property set. By calling the methods of these interfaces, an application developer can manage whatever property sets are appropriate for a given file system entity. Use of these interfaces provides one tuned reading and writing implementation for properties, rather than having an implementation in each application, which could suffer performance bottlenecks such as incessant seeking. You can implement the interfaces to enhance performance, so properties can be read and written more quickly by, for example, more efficient caching. Furthermore, IPropertyStorage and IPropertySetStorage make it possible to manipulate properties on entities that do not support IStorage, although in general, most applications will not do so.