У меня вопрос о сериализации структур данных. Существует множество возможностей сериализации структур данных (также называемых маршаллингом или дефлированием, см. вики-статья). Кажется, что каждый язык программирования, фреймворк, стандарт или библиотека приносят с собой свои собственные методы сериализации. Многие также определяют свой собственный язык описания данных/интерфейса (который я предпочитаю структуре данных, зависящей от языка, определенной только внутри кода). Вот лишь некоторые из них (см. вики-статью): COM IDL, CORBA IDL, Thrift IDL, буфер протокола Google ".proto", XSD, ASN.1 IDL и т. д. Некоторые из этих сериализаций могут генерировать собственную структуру данных языка и код для сериализации и десериализации этих структур.
Я провел некоторое исследование на эту тему, но я все еще не решил. Итак, мой вопрос: Какую сериализацию мне следует использовать?
Мои требования: расширяемость, эффективное использование пространства (по крайней мере, в двоичном виде), эффективный доступ к данным, простота использования (возможно, со сгенерированным кодом и геттерами и сеттерами) и совместимость с C++.
Расширяемость должна обеспечивать прямую и обратную совместимость. Чтобы быть более конкретным, часто форматы данных, которые я пишу, со временем будут расти, потому что я добавляю новые поля данных, которые я не мог предвидеть в начале разработки. Теперь я хотел бы иметь возможность читать сохраненные данные из устаревшего формата с более новой версией программного обеспечения, поля данных, не найденные в старых сохраненных данных, могут быть заполнены значениями по умолчанию или чем-то еще. С другой стороны, я хотел бы иметь возможность читать данные, записанные с новым описанием. Затем поле неизвестных данных должно игнорироваться программным обеспечением, скомпилированным со «старым» описанием данных (возможно, сгенерировав некоторое предупреждение).
Есть ли какие-нибудь рекомендации? Мы также будем признательны за рекомендации по дальнейшему чтению по этому вопросу.
--- Изменить ---
1) boost::serialization кажется довольно популярным. У него есть несколько действительно приятных функций, очень хорошая документация, и синтаксис кажется довольно простым. Может быть, я немного придирчив, но есть некоторые вещи, которые мне не нравятся: я не понимаю, как он может справиться с прямой совместимостью (см. 4). Я бы предпочел сгенерированный код.
2) google protobuf, кажется, лучше соответствует моим потребностям, но я не изучал их глубину. Кажется, они хорошо справляются с прямой и обратной совместимостью (см. 5). У них есть генераторы кода для разных языков, и разработчики знают об очень похожих концепциях, таких как (см. Часто задаваемые вопросы). Я буду глубже изучать protobufs.
3) Boost Spirit, похоже, не то, что я ищу.