Межплатформенная и языковая (де) сериализация

Я ищу способ сериализации связки С++-структур самым удобным способом, чтобы сериализация была переносимой на С++ и Java (как минимум) и на 32-битные/64-битные, большие/маленькие endian-платформы. Структуры, подлежащие сериализации, просто содержат данные, т.е. Они являются чистыми объектами данных без состояния или поведения.

Идея состоит в том, что мы сериализуем структуры в октет-блоб, которые мы можем хранить в базе данных "в общем", и читать позже. Таким образом, избегая изменения базы данных всякий раз, когда структура изменяется, а также избегая назначения каждого элемента данных в поле - т.е. Мы хотим, чтобы только одна таблица содержала все "в общем" как двоичный blob. Это должно сделать меньше работы для разработчиков и потребовать меньше изменений при изменении структур.

Я посмотрел на boost.serialize, но не думаю, что есть способ включить совместимость с Java. А также для наследования Serializable в Java.

Если есть способ сделать это, начиная с файла IDL, который был бы лучшим, поскольку у нас уже есть файлы IDL, которые описывают структуры.

Приветствуем заранее!

8
14 сент. '09 в 16:57
источник поделиться
7 ответов

Я удивлен, что Джон Скит еще не набросился на это: -)

Буферы протоколов в значительной степени предназначены для такого рода сценариев - передачи межструктурных данных структурированных данных.

Тем не менее, если вы используете базу данных так, как вы предлагаете, вы действительно не должны использовать полноразмерные СУБД, такие как Oracle или SQL Server, а скорее простое хранилище ключей, такое как Berkeley DB или один из многие "облачные таблицы".

6
14 сент. '09 в 23:19
источник

Если я хочу действительно по-настоящему перекрестно использовать язык, я обычно предлагаю JSON, поскольку простота поддержки javascript и обилие библиотек, а также быть читаемым человеком и модифицируемым (я предпочитаю его XML, поскольку я нахожу его меньшим с точки зрения символов, быстрее и читабельнее). Однако он не самый эффективный с точки зрения пространства и более машиночитаемый формат, например протокольные буферы или thrift будет иметь преимущества там (бережливость может быть сделана из IDL, но она также предназначена для служб кодирования, поэтому она может быть тяжелее, чем вы хотите).

6
14 сент. '09 в 23:42
источник

Я споткнулся здесь, имея очень похожий вопрос. 6 лет спустя, это может быть вам не полезно, но, надеюсь, это будет для других.

Есть много альтернатив, к сожалению, без четкого победителя (хотя можно утверждать, что JSON - явный победитель). Даже Google выпустил несколько конкурирующих технологий (все они, по-видимому, используются внутри):

Не забывайте альтернативы, опубликованные в других ответах. Вот еще несколько:

  • YAML: JSON минус все двойные кавычки, но вместо этого используется отступ. Это более человечно читаемый, но, вероятно, менее эффективный, особенно по мере его увеличения.
  • BSON (двоичный JSON)
  • MessagePack (Другой сжатый JSON)

С таким большим количеством вариаций JSON явно является победителем в плане простоты/удобства и межплатформенного доступа. Он приобрел еще большую популярность в последние пару лет, с ростом JavaScript. Многие люди, вероятно, используют это как де-факто решение, не задумываясь о том, что я изначально сделал: P).

Однако, если размер становится проблемой, но вы предпочитаете сохранять все просто и не использовать одну из более сложных библиотек, вы можете просто сжать JSON, используя zlib (что я сейчас делаю) или какой-то другой кросс-платформенный алгоритм (но это целая другая тема).

Чтобы ускорить обработку JSON на С++, вы также можете использовать RapidJSON.

3
07 июля '15 в 8:12
источник

Почему вы не выбрали XML, поскольку это идеально подходит для вашего спроса. Как С++, так и Java позволяют легко реализовать.

Кроме того, я сомневаюсь в вашей идее хранить все как blob в базе данных, использовать реляционную базу данных, для чего была создана база данных, или переключиться на некоторую объектно-ориентированную базу данных, например http://www.versant.com/en_US/products/objectdatabase, который поддерживает как Java, так и С++.

1
14 сент. '09 в 23:11
источник

Вам нужно ASN.1! (Некоторые люди называют это двоичным XML.) ASN.1 очень компактен и, следовательно, идеален для передачи данных между двумя системами. И для тех, кто не считает, что это когда-либо используется: несколько интернет-протоколов основаны на модели ASN.1 для сериализации данных!

К сожалению, библиотек, доступных для Java или С++, недостаточно для поддержки ASN.1. Мне пришлось работать с ним несколько лет назад и просто не мог найти хороший, бесплатный или недорогой инструмент для поддержки ASN.1 на С++. В Objective Systems они продают решения ASN.1/XML, но это чрезвычайно дорого. (ASN.1 компилятор для С++ и Java, то есть!) Это стоит вам руку и ногу хотя бы! (Но тогда у вас будет инструмент, который вы можете использовать только одной рукой...)

1
14 сент. '09 в 23:29
источник

Я бы предложил сохранить данные с помощью SQLite. Структуры могут храниться как строки базы данных в таблицах SQLite.

Полученный файл базы данных совместим с двоичными файлами на разных платформах и может быть сохранен как BLOB в вашей основной базе данных. Я считаю, что размер файла сравним с сжатым XML файлом с теми же данными, но использование памяти во время обработки будет значительно меньше, чем XML DOM.

1
13 апр. '10 в 0:28
источник

Существует также Avro. Посмотрите этот вопрос для сравнения бережливости Apache, буферов протоколов, mes и т.д.

0
07 февр. '12 в 16:01
источник

Посмотрите другие вопросы по меткам или Задайте вопрос