Будет много текста.
Я даже не знаю, скорее всего я спрашиваю — «где мне взять такое готовое?»,
но, дело в том, что кратко я это описать не смогу, т.к. не знаю как это называется.
Итак, что же мне нужно.
Я хочу раз и навсегда выбрать
и использовать универсальный формат хранения данных.
Что я под этим подразумеваю?
Берем некую абстрактную программу, которая манипулирует какими-либо данными.
И эти данные сохраняются.
Пусть будут живые примеры:
Ardour сохраняет свои проекты в XML, фотошоп в своем бинарном, ёксель в zip+XML, ну и т.д...
Как правило (в приведенных примерах и далее в моем случае)
сами данные представляют собой «дерево» где какие-то зависимые элементы лежат внутри родительских.
Некоторые (ёксель) комбинируют несколько уровней для создания дерева данных: zip->fs->xml.
А зачем это все?
Я же просто хочу сохранять состояние, файл проекта, логи или что-то еще..
Т.е, конечно понятно, возможно где-то удобен xml, где-то JSON,
где-то ini, а где-то бинарь. Но проблема в том, что у всех все по разному.
И для преобразования в удобоваримый вид внутри приложения
(структуры, массивы, указатели, ссылки, значения),
(кроме бинарного хранения) необходим парсер и интерпретатор/транслятор этих данных,
причем в обе стороны (fs->?*->app и app->?*->fs).
Форматов много, и для каждого куча либ, писанных за авторстом от васяна до профессора.
Нет, я пишу сюда потому, что не хочу чтобы случилось так:
http://twentysix.ru/uploads/images/00/91/06/2016/05/10/adaaed_full.png
Выше я описал все расплывчато.
А теперь будет более похоже на спеку.
Конечно я могу упустить сейчас некоторые детали.
Но это от того, что я не продумывал все глубоко.
И все еще уверен, что я далеко не первый, и эта шляпа уже сделана и имеет название.
Итак, поехали.
1) Формат хранения данных — бинарный.
Да, бинарный.
Почему?
Потому что сразу прочитал его в память (да, с валидацией, о ней ниже) и все.
2) Дерево данных. Каждый узел — это бинарный пакет с заголовком, хешсуммой и указанием размера узла,
включая размеры потомков, или смещения откуда начинаются потомки со своими заголовками.
Да, декларативное бинарное описание структур данных любого моего/вашего приложения.
3) Единый парсер-транслятор туда/сюда.
Он знает только то, как ему распарсить свои декларации,
отсеить их, а на выходе будут уже готовые к работе данные в памяти.
Таким образом вы можете seek'ать в файле или ожидать желаемую позицию смещения в буфере,
чтобы пропустить не интересующие вас в данный момент данные
(в XML, да и в любых text-based, с этим облом, он последовательный, текстовый, посимвольный,
пока не пропарсишь минимум узел, а он может быть огромным, с вложениями, ты не узнаешь структуру).
Так же для парсера должна быть определена схема (отсылка к XSD schema) внутри приложения,
можете называть это конфигом парсера для заточки именно под ваши данные.
Именно сюда могут быть и «забиндены коллбеки валидатора».
При сохранении же должно быть обратное действие.
Теперь снова простыми словами.
Я хочу что-то типа бинарного XML, ака узлы-пакеты,
где сразу лежат бинарные данные.
И универсально транслировать это все в сишное приложение.
Так вот. Есть ли такое готовое? Если есть — подскажите.
Если нет — отпишитесь что вы обо всем этом думаете?
Какие слабые и сильные стороны этой эпопеи?
<joke-mode>Хм... Да, очень похоже на кусок OSI. Но почему данные не хранят в виде TCP пакетов?</joke-mode>
Сабж.