Простая в использовании расширяемая сериализация / сортировка? - PullRequest
6 голосов
/ 25 февраля 2011

У меня вопрос по поводу сериализации структур данных. Существует много возможностей для сериализации структур данных (также называемых 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) Похоже, что бодрость духа - это не то, что я ищу.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Boost :: serialize отлично

  • Поддерживает разные версии архива
  • Хорошая поддержка большинства структур данных (указатели, векторы ...)
  • Очень быстро (10 секунд на 1 ГБ, поэтому ваш жесткий диск ограничен)
  • Довольно прост в использовании
  • Сжатие на лету, если используется с boost :: iostreams

Недостатки:

  • Архив может быть несовместим с одной табличной формы на другую
  • Только для C ++, без обмена с другими языками

Хорошая альтернатива, которая растет, это буферы протокола от Google http://code.google.com/p/protobuf/

  • Не зависит от языка
  • Поддержка версий
  • Очень быстро

Так что, если вы хотите обмениваться данными между различными системами, я бы выбрал Protocol Buffers. Однако, если у вас есть одно приложение, я бы использовал boost :: serialize

2 голосов
/ 25 февраля 2011

Я некоторое время использовал библиотеку boost для сериализации - она ​​хорошо расширяема, эффективна и поддерживает отдельное управление версиями для каждого сериализуемого объекта.Все эти особенности, конечно, означают, что это сложный зверь, и для правильного обучения требуется некоторое время.Не так быстро, чтобы компилировать либо.И если вы когда-нибудь попытаетесь принести его на платформу, которая официально не поддерживается, ожидайте отладки какого-то очень запутанного кода.Совместимость файлов на разных платформах может быть слегка нестабильной, и прямая совместимость не будет работать.В целом, ускоренная сериализация, как правило, не является хорошим выбором, если вам нужно, чтобы экземпляры приложений взаимодействовали друг с другом.Тем не менее, это не так уж плохо для правильного проекта.

http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/index.html

Boost также имеет более новую библиотеку Spirit для более общего анализа / вывода, но я не использовал ее и не будуне рекомендую его, основываясь на первых впечатлениях - требуется некоторое усердие, чтобы понять, для чего предназначена библиотека с особым именем- это не так сложно, и вы получите именно те функции, которые вам нужны.Вызывает разочарование тот факт, что в мире C ++ сериализация все еще не решена должным образом, но к такому выводу я пришел в прошлый раз, когда мне пришлось выбирать функциональность сериализации.Хотя использование сериализации boost какое-то время давало хорошее представление о том, к чему стремиться в моей собственной реализации.

...