2009-11-27 7 views
3

Есть ли хорошие существующие библиотеки сериализации C++, которые поддерживают частичную сериализацию?Библиотека сериализации C++, которая поддерживает частичную сериализацию?

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

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

boost::serialization с первого взгляда похоже, что он поддерживает только все или ничего.

Редактировать: через 3 года после первоначального написания этого я оглядываюсь назад и говорю себе: «а?»? boost :: serialization позволяет определить, какие члены вы хотите сохранить или нет, поэтому он будет поддерживать «частичную сериализацию», как я, кажется, описал ее. Кроме того, поскольку на C++ отсутствуют библиотеки для сериализации рефлексии, вам нужно явно указать каждого члена, который вы сохраняете, если они не приходят с каким-то внешним инструментом для анализа исходных файлов или имеют отдельный формат входных файлов, который используется для генерации кода на C++ (например, какие протокольные буферы). Я думаю, что, должно быть, я был концептуально смущен, когда написал это.

ответ

4

Вы явно не ищете сериализацию здесь.

Сериализация - это сохранение объекта, а затем воссоздание его из потока байтов. Думайте, что видеоигры сохраняют или контекст сеанса для веб-сервера.

Здесь вам нужна передача сообщений. Google's FlatBuffers приятно для этого. Укажите сообщение, которое будет содержать каждое отдельное поле как необязательное, после приема сообщения, обновите свой объект с полями, которые существуют, и оставите остальные нетронутыми.

Отличная вещь с FlatBuffers заключается в том, что она прекрасно сочетает обратную и обратную совместимость, а также текстовую и двоичную кодировку (текст отлично подходит для отладки, а бинарное - для чистой производительности), помимо шага анализа нулевой стоимости ,

И вы даже можете декодировать сообщения на другом языке (например, python или ruby), если вы их где-то сохраните и хотите скомпоновать html gui, чтобы проверить его!

+0

Я бы не сказал, что я «явно не ищу сериализации». Возможно, библиотеки сериализации обычно не рассматривают этот вариант использования, но я думаю, что это довольно естественное расширение полной сериализации, чтобы иметь возможность сохранять только подмножество элементов объекта. Отправка данных по сети является лишь одним возможным вариантом использования. –

+0

Я не хочу казаться педантичным, но сериализация заключается в том, чтобы сэкономить достаточно информации, чтобы вы могли восстановить семантически идентичный клон. Для этого может быть достаточно подмножества атрибутов (если вы можете вычислить остальные). Здесь, однако, у нас есть другой случай: это скорее шаблон Observer. И шаблон Observer действительно касается общения ... и поэтому мы говорим о событиях (или сообщениях). Является ли сеть вовлеченной, не имеет большого значения (хотя это немного усложняет ситуацию). –

+0

Я тоже не хочу казаться педантичным, но если сериализация сохраняет достаточную информацию для создания семантически идентичного клона, частичная сериализация может содержать достаточно информации для создания частично семантически идентичного «клона»;) Или, вернее, идентична некоторым (более узкой, чем исходная). –