Введение
Компьютерная технология, разработанная Microsoft
COM Structured Storage (также известная как структурированное хранилище COM или структурированное хранилище OLE) — это технология, разработанная Microsoft в рамках своей операционной системы Windows для хранения иерархических данных в одном файле. В строгом смысле, термин «структурированное хранилище» относится к набору интерфейсов COM, которые должна предоставлять соответствующая реализация, а не к конкретной реализации или конкретному формату файла (фактически, реализация структурированного хранилища не обязана хранить свои данные в файле вообще). Помимо обеспечения иерархической структуры данных, структурированное хранилище может также предоставлять ограниченную форму поддержки транзакций при доступе к данным. Microsoft предоставляет реализацию с поддержкой транзакций, а также реализацию без неё (называемую хранилищем в простом режиме, последняя реализация также имеет другие ограничения, хотя и работает быстрее). Структурированное хранилище широко используется в приложениях Microsoft Office, хотя в новых версиях (начиная с Office 2007) по умолчанию используется Office Open XML, основанный на XML. Оно также является важной частью технологий COM и связанных с ними технологий связывания и встраивания объектов (OLE). Другие известные области применения структурированного хранилища включают SQL Server, оболочку Windows и многие сторонние CAD-программы.
Мотивация
Структурированное хранение решает некоторые inherentные трудности хранения нескольких объектов данных в одном файле. Одна из трудностей возникает, когда объект, сохраненный в файле, меняет размер в результате обновления. Если приложение, читающее/записывающее файл, ожидает, что объекты в файле останутся в определенном порядке, все, что следует за представлением этого объекта в файле, может потребоваться сдвинуть назад, чтобы освободить место, если объект увеличивается, или вперед, чтобы заполнить освободившееся пространство, если объект уменьшается. Если файл большой, это может привести к дорогостоящей операции. Разумеется, существует множество возможных решений этой проблемы, но часто программисту не хочется заниматься деталями низкого уровня, такими как бинарные форматы файлов. Структурированное хранилище предоставляет абстракцию, известную как поток, представленную интерфейсом IStream. Поток концептуально очень похож на файл, а интерфейс IStream предоставляет методы чтения и записи, аналогичные файловому вводу/выводу. Поток может находиться в памяти, в файле, внутри другого потока и т. д., в зависимости от реализации. Другая важная абстракция – это хранилище, представленное интерфейсом IStorage. Хранилище по своей концепции очень похоже на каталог в файловой системе. Хранилища могут содержать потоки, а также другие хранилища. Если приложение хочет сохранить несколько объектов данных в файле, одним из способов сделать это будет открыть IStorage, представляющий содержимое этого файла, и сохранить каждый из объектов в отдельном IStream. Один из способов реализации этого – использование стандартного COM-интерфейса IPersistStream. OLE в значительной степени опирается на эту модель для встраивания объектов в документы.
Нативная структурированная система хранения
Во время бета-тестирования Windows 2000 в состав системы входила функция под названием Native Structured Storage (NSS) для хранения документов структурированного хранения (таких как двоичные форматы Microsoft Office и файл thumbs.db, используемый проводником Windows для кэширования эскизов), при этом каждый поток, составляющий документ, хранился в отдельном потоке данных NTFS. В систему входили утилиты, которые автоматически разбивали потоки в обычном документе структурированного хранения на потоки данных NTFS и обратно. Однако эта функция была удалена после бета-версии 3 из-за несовместимости с другими компонентами операционной системы, и все файлы NSS автоматически конвертировались в формат единого потока данных.