Будет много текста.
Я даже не знаю, скорее всего я спрашиваю — «где мне взять такое готовое?», но, дело в том, что кратко я это описать не смогу, т.к. не знаю как это называется.
Итак, что же мне нужно.
Я хочу раз и навсегда выбрать и использовать универсальный формат хранения данных. Что я под этим подразумеваю?
Берем некую абстрактную программу, которая манипулирует какими-либо данными. И эти данные сохраняются. Пусть будут живые примеры: 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>
Сабж.