Я бы подумал об определении подструктуры, которую более высокие уровни используют для хранения данных, немного похожей на мини-файловую систему внутри файла.
Например, даже если ваш формат файла будет хранить данные, специфичные для приложения, я бы рассмотрел возможность определения записей/потоков и т. д. внутри файла таким образом, чтобы независимый от приложения код мог понять структуру файла, но не конечно понимаю непрозрачные полезные нагрузки.
Давайте немного конкретнее. Рассмотрим обычные способы хранения данных в памяти: как правило, они могут быть сведены либо к непрерывным расширяемым массивам/спискам, либо к графам на основе указателей/ссылок, либо к бинарным блокам данных в определенных форматах.
Таким образом, может быть полезно определить формат двоичного файла аналогичным образом. Используйте заголовки записей, которые указывают длину и состав следующих данных, независимо от того, представлены ли они в форме массива (список записей одинакового типа), ссылок (смещений к другим записям в файле) или больших двоичных объектов данных (например, строковых данных). в определенной кодировке, но не содержащие ссылок).
При тщательном проектировании это может позволить использовать формат файла не только для сохранения и сохранения данных за один раз, но и постепенно, по мере необходимости. Если подструктура спроектирована правильно, она может быть независимой от приложения, но все же разрешать, например. приложение для сбора мусора, которое необходимо написать, которое понимает BLOB-объекты, массивы и типы ссылочных записей, а также способно отслеживать файл и удалять неиспользуемые записи (т. е. записи, на которые больше не указываются).
Это только одна идея. Другими местами, где можно искать идеи, являются общие проекты файловых систем или стратегии физического хранения реляционных баз данных.
Конечно, в зависимости от ваших требований, это может быть излишним. Возможно, вам просто нужен двоичный формат для сохранения данных в памяти, и в этом случае подход, который следует учитывать, — это помеченные записи.
В этом подходе каждый фрагмент данных имеет префикс тега. Тег указывает тип следующих непосредственно за ним данных и, возможно, их длину и имя. Списки могут иметь суффикс «конечный список», который не имеет полезной нагрузки. Тег может иметь встроенный идентификатор, поэтому непонятные теги могут быть проигнорированы механизмом сериализации при чтении. В этом отношении он немного похож на XML, за исключением того, что вместо этого используются двоичные идиомы.
На самом деле, XML — это хорошее место для поиска долговечности формата файла. Посмотрите на его возможности пространства имен. Если вы тщательно строите свой код для чтения и записи, должна быть возможность писать приложения, сохраняющие расположение и содержимое помеченных (рекурсивно) данных, которые они не понимают, возможно, потому, что они были написаны более поздней версией того же приложения.
person
Barry Kelly
schedule
27.11.2008