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