Можно ли сериализовать и десериализовать класс в C ++?
Я использую Java уже 3 года, и сериализация / десериализация на этом языке довольно тривиальна. Есть ли в C ++ похожие функции? Существуют ли собственные библиотеки, которые обрабатывают сериализацию?
Пример будет полезен.
c++
serialization
Agusti-N
источник
источник
Ответы:
Boost::serialization
Библиотека обрабатывает это довольно элегантно. Я использовал это в нескольких проектах. Вот пример программы, показывающей, как ее использовать, здесь .Единственный родной способ сделать это - использовать потоки. По сути, это все, что
Boost::serialization
делает библиотека, это расширяет потоковый метод, устанавливая платформу для записи объектов в текстовый формат и чтения их из того же формата.Для встроенных типов, или ваших собственных типов с
operator<<
иoperator>>
правильно определили, что это довольно просто; см. C ++ FAQ для получения дополнительной информации.источник
Я понимаю, что это старый пост, но он один из первых, который появляется при поиске
c++ serialization
.Я призываю всех, кто имеет доступ к C ++ 11, взглянуть на cereal , библиотеку C ++ 11 только для заголовков для сериализации, которая поддерживает двоичные файлы, JSON и XML из коробки. cereal был спроектирован так, чтобы его было легко расширять и использовать, и синтаксис аналогичен Boost
источник
Повышение является хорошим предложением. Но если вы хотите сделать свой собственный ролл, это не так сложно.
По сути, вам просто нужен способ построить граф объектов и затем вывести их в некоторый структурированный формат хранения (JSON, XML, YAML и т. Д.). Построить график так же просто, как использовать алгоритм маркировки рекурсивного достойного объекта и затем вывести все отмеченные объекты.
Я написал статью, описывающую элементарную (но все еще мощную) систему сериализации. Вам может быть интересно: Использование SQLite в качестве формата файлов на диске, часть 2 .
источник
Что касается «встроенных» библиотек, то
<<
и>>
были зарезервированы специально для сериализации.Вы должны переопределить,
<<
чтобы вывести свой объект в некоторый контекст сериализации (обычно этоiostream
) и>>
прочитать данные обратно из этого контекста. Каждый объект отвечает за вывод своих агрегированных дочерних объектов.Этот метод работает нормально, пока ваш граф объектов не содержит циклов.
Если это произойдет, то вам придется использовать библиотеку для обработки этих циклов.
источник
<<
операторы используются для печати понятных человеку текстовых представлений объектов, что очень часто не то, что вы хотите для сериализации.<<
универсальногоostream
, попробуйте определить его для файлового потока.<<
чтобы вывести свой объект в некоторый контекст сериализации… Каждый объект отвечает за вывод своего…» - вопрос состоит в том, как избежать трудоемкой записи этого для каждого объекта: сколько может язык или библиотеки помогают?Я рекомендую буферы протокола Google . У меня была возможность протестировать библиотеку в новом проекте, и она удивительно проста в использовании. Библиотека сильно оптимизирована для производительности.
Protobuf отличается от других упомянутых здесь решений для сериализации тем, что он не сериализует ваши объекты, а генерирует код для объектов, которые сериализуются в соответствии с вашей спецификацией.
источник
Boost :: serialization - отличный вариант, но я столкнулся с новым проектом: Cereal, который я считаю гораздо более элегантным! Я настоятельно рекомендую исследовать это.
источник
Вы можете проверить протокол amef , пример кодирования C ++ в amef будет выглядеть так:
Расшифровка в Java будет как,
Реализация протокола имеет кодеки как для C ++, так и для Java, интересная часть заключается в том, что она может сохранять представление класса объекта в виде пар «имя-значение». Мне потребовался аналогичный протокол в моем последнем проекте, когда я случайно наткнулся на этот протокол, я фактически изменил базовую библиотеку в соответствии с моими требованиями. Надеюсь, это поможет вам.
источник
Я рекомендую использовать сериализацию Boost, как описано другими авторами. Вот хороший подробный учебник о том, как его использовать, который прекрасно дополняет учебники повышения: http://www.ocoudert.com/blog/2011/07/09/a-practical-guide-to-c-serialization/
источник
Sweet Persist это еще один.
Существует возможность сериализации в и из потоков в XML, JSON, Lua и двоичных форматах.
источник
Я предлагаю изучить абстрактные фабрики, которые часто используются в качестве основы для сериализации
Я ответил на другой вопрос о фабриках C ++. Пожалуйста , смотрите там , если гибкий завод представляет интерес. Я пытаюсь описать старый способ из ET ++ для использования макросов, который отлично сработал для меня.
ET ++ был проектом для переноса старого MacApp на C ++ и X11. В связи с этим Эрик Гамма и другие начали задумываться о дизайне шаблонов . ET ++ содержал автоматические способы сериализации и самоанализа во время выполнения.
источник
Если вам нужна простая и лучшая производительность и вам не нужна обратная совместимость данных, попробуйте HPS , он легкий, намного быстрее, чем Boost и т. Д., И намного проще в использовании, чем Protobuf и т. Д.
Пример:
источник
Вот простая библиотека сериализатора, которую я собрал. Это только заголовок, c11 и есть примеры для сериализации основных типов. Вот один для карты в класс.
https://github.com/goblinhack/simple-c-plus-plus-serializer
Вывод:
источник
Я использую следующий шаблон для реализации сериализации:
Вот
T
тип, который вы хотите сериализоватьMode
, это фиктивный тип, чтобы различать разные виды сериализации, например. одно и то же целое число может быть сериализовано как little-endian, big endian, varint и т. д.По умолчанию
Serializer
делегирует задачу сериализуемому объекту. Для встроенных типов вы должны сделать шаблон специализацииSerializer
.Удобные шаблоны функций также предоставляются.
Например, немного порядковый номер сериализации без знака целых чисел:
Затем сериализовать:
Для десериализации:
Из-за абстрактной логики итератора он должен работать с любым итератором (например, потоковыми итераторами), указателем и т. Д.
источник