Можно ли автоматически сериализовать объект C ++? - PullRequest
9 голосов
/ 24 января 2010

Есть ли что-то похожее на сериализацию Java / .NET для C ++?

Ответы [ 6 ]

12 голосов
/ 24 января 2010

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

7 голосов
/ 24 января 2010

К сожалению, в C ++ нет автоматического способа сериализации объектов. Это связано с тем, что любой механизм сериализации должен уметь «понимать» пользовательский объект во время выполнения, а C ++ не содержит для этого необходимой информации. Java и .Net с другой стороны имеют то, что называется, Reflection. Этот механизм позволяет любому просматривать структуру данных любого произвольного объекта во время выполнения.

Все это не означает, что не существует способа сериализации объекта C ++ при относительно небольших усилиях. Возьмем, к примеру, стандартную библиотеку потоков C ++. Написав

int x = 2010;
cout << x << endl;

вы фактически сериализуете объект типа int. Возможно также расширить этот механизм для поддержки вашего пользовательского класса. Это делается просто путем перегрузки оператора <<. Это не так хорошо, как Java-сериализация, но и очень удобно. </p>

Есть также некоторые библиотеки, которые делают его еще более простым. Как уже упоминалось, библиотека повышения сериализации отлично справляется со своей задачей. Работа с сериализацией Boost очень похожа на работу с iostream, но она решает некоторые проблемы, присущие стандартным потокам.

4 голосов
/ 24 января 2010

Буферы протокола Google обеспечивает реализацию C ++ в основном пакете; В качестве приятного преимущества вы можете поделиться этими данными с множеством других языков - но вы будете ограничены использованием сгенерированных типов, а не ваших собственных (которые некоторые механизмы сериализации в других поддержка языков).

На самом деле это не проблема, так как (при необходимости) вы можете просто рассматривать сгенерированные типы как DTO, которые близки к вашим фактическим объектам домена.

3 голосов
/ 24 января 2010

Boost.Serialization - очень хорошая библиотека, и она также поддерживает базовое управление версиями - то, что никогда не возможно при автоматической сериализации. Поскольку мне понадобилось еще лучшее управление версиями, я фактически написал свою собственную библиотеку сериализации, которая соответствует стилю Boost.Serialization (поскольку автор Boost.Serialization не был заинтересован в его улучшении).

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

Следует отметить, что популярный метод сохранения целых структур (путем приведения их к типу char * и записи байтов sizeof (struct)) полностью непереносим, ​​он не поддерживает управление версиями и ломается, если структура содержит какие-либо указатели. или C ++ (не POD) объекты.

2 голосов
/ 26 апреля 2012

С большой ручной работой (фактически, реализуя свой собственный навязчивый или неинтрузивный RTTI) можно достичь уровня автоматизации, сопоставимого с C # / Java.

Подробную информацию смотрите здесь:

Как реализовать сериализацию в C ++

1 голос
/ 05 апреля 2015

Я успешно использовал этот:

http://uscilab.github.io/cereal/

, и он хорошо работал для меня как на iOS, так и на Android.Это библиотека только для заголовков и не имеет внешних зависимостей, поэтому ее чрезвычайно удобно использовать.Я предпочел это над бустом, потому что я не хотел импортировать все зависимости буста.Библиотека небольшая и поддерживает XML, JSON, двоичные и пользовательские форматы сериализации.

Библиотека (например, boost) требует, чтобы вы явно написали некоторый код сериализации и десериализации для базовых классов, тогда как коллекции обрабатываются автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...