Можно ли сериализовать и десериализовать class в C ++?

Можно ли сериализовать и десериализовать class в C ++?

Я использую Java уже 3 года, а сериализация / десериализация довольно тривиальны в этом языке. Есть ли у C ++ аналогичные функции? Существуют ли встроенные библиотеки, которые обрабатывают сериализацию?

Пример будет полезен.

Библиотека Boost::serialization обрабатывает это довольно элегантно. Я использовал его в нескольких проектах. Здесь есть пример программы, показывающей, как ее использовать.

Единственный способ сделать это – использовать streamи. Это по существу вся Boost::serialization , она расширяет метод streamа, настраивая структуру для записи объектов в текстовый формат и считывая их из того же формата.

Для встроенных типов или ваших собственных типов с корректным определением operator<< и operator>> , это довольно просто; см. часто задаваемые вопросы по C ++ .

Я понимаю, что это старый пост, но это один из первых, который появляется при поиске c++ serialization .

Я призываю всех, у кого есть доступ к C ++ 11, чтобы посмотреть на зерновой , только для библиотеки C ++ 11 для сериализации, которая поддерживает двоичные, JSON и XML из коробки. зерно было спроектировано так, чтобы его легко расширять и использовать, и он имеет аналогичный синтаксис для Boost.

Boost – хорошее предложение. Но если вы хотите катиться самостоятельно, это не так сложно.

В основном вам просто нужен способ построения графика объектов, а затем вывод их в какой-то структурированный формат хранения (JSON, XML, YAML, что угодно). Создание графика так же просто, как использование рекурсивного алгоритма достойного объекта маркировки, а затем вывод всех отмеченных объектов.

Я написал статью, описывающую рудиментарную (но все же мощную) систему сериализации. Вам может показаться интересным: использование SQLite в качестве формата файла на диске, часть 2 .

Я рекомендую буферы протокола Google. У меня была возможность протестировать библиотеку в новом проекте, и она замечательно проста в использовании. Библиотека сильно оптимизирована для производительности.

Protobuf отличается от других решений сериализации, упомянутых здесь, в том смысле, что он не сериализует ваши объекты, а генерирует код для объектов, которые сериализуются в соответствии с вашей спецификацией.

Boost :: serialization – отличный вариант, но я столкнулся с новым проектом: Cereal, который я нахожу намного более элегантным! Я настоятельно рекомендую исследовать его.

Что касается «встроенных» библиотек, то << и >> зарезервированы специально для сериализации.

Вы должны переопределить << для вывода своего объекта в некоторый контекст сериализации (обычно это iostream ) и >> для чтения данных из этого контекста. Каждый объект отвечает за вывод своих агрегированных дочерних объектов.

Этот метод работает отлично, пока граф объекта не содержит циклов.

Если да, то вам придется использовать библиотеку для обработки этих циклов.

Вы можете проверить протокол amef , пример C ++-кодирования в amef будет похож,

  //Create a new AMEF object AMEFObject *object = new AMEFObject(); //Add a child string object object->addPacket("This is the Automated Message Exchange Format Object property!!","adasd"); //Add a child integer object object->addPacket(21213); //Add a child boolean object object->addPacket(true); AMEFObject *object2 = new AMEFObject(); string j = "This is the property of a nested Automated Message Exchange Format Object"; object2->addPacket(j); object2->addPacket(134123); object2->addPacket(false); //Add a child character object object2->addPacket('d'); //Add a child AMEF Object object->addPacket(object2); //Encode the AMEF obejct string str = new AMEFEncoder()->encode(object,false); 

Декодирование в java было бы похоже,

  string arr = amef encoded byte array value; AMEFDecoder decoder = new AMEFDecoder() AMEFObject object1 = AMEFDecoder.decode(arr,true); 

Реализация протокола имеет кодеки как для C ++, так и для Java, интересная часть заключается в том, что она может сохранять представление classа объектов в виде пар значений имени, мне нужен аналогичный протокол в моем последнем проекте, когда я случайно наткнулся на этот протокол, изменила базовую библиотеку в соответствии с моими требованиями. Надеюсь, это вам поможет.

Я рекомендую использовать сериализацию boost, как описано другими плакатами. Вот хороший подробный учебник о том, как его использовать, который прекрасно дополняет учебные пособия: http://www.ocoudert.com/blog/2011/07/09/a-practical-guide-to-c-serialization/

Sweet Persist – еще один.

Можно сериализовать в streamи и из streamов в форматах XML, JSON, Lua и двоичных форматах.

Я предлагаю изучить абстрактные фабрики, которые часто используются в качестве основы для сериализации

Я ответил в другом вопросе о C ++ фабриках. Пожалуйста, смотрите там, если интересна гибкая фабрика. Я пытаюсь описать старый путь из ET ++, чтобы использовать macros, которые отлично поработали для меня.

ET ++ был проектом для переноса старого MacApp на C ++ и X11. В попытке этого Эрик Гамма и т. Д. Начал думать о Design Patterns . ET ++ содержит автоматические способы сериализации и интроспекции во время выполнения.

Если вам нужна простая и эффективная производительность, и вам не нужна обратная совместимость данных, попробуйте HPS , она будет легкой, намного быстрее, чем Boost и т. Д., И будет намного проще в использовании, чем Protobuf и т. Д.

Пример:

 std::vector data({22, 333, -4444}); std::string serialized = hps::serialize_to_string(data); auto parsed = hps::parse_from_string>(serialized); 
  • Сериализация прерываний в .NET 4.5
  • Сериализация экземпляра classа для JSON
  • Проблема при сохранении данных от Spark-Streaming до Cassandra
  • Как писать и читать java-сериализованные объекты в файл
  • Как я могу расширить лексический бросок, чтобы поддерживать перечисленные типы?
  • как правильно реализовать Parcelable с ArrayList ?
  • Как называются конструкторы во время сериализации и десериализации?
  • ASP.NET MVC: управление сериализацией имен свойств с помощью JsonResult
  • Java Serializable Object to Byte Array
  • Плагин jQuery для сериализации формы, а также восстановления / заполнения формы?
  • Как использовать Gson API Google для десериализации JSON правильно?
  • Давайте будем гением компьютера.