C++. Сборник рецептов - [200]

Шрифт
Интервал


>int main() {

> using namespace std;

> using namespace boost::archive;       // пространство имен для архивов

> using namespace boost::serialization; // пространство имен для make_nvp

> try {

>  // Заполнить список животных

>  vector animalList;

>  animalList.push_back(

>   Animal("Herby", "elephant", "1992-04-23",

>   Contact("Dr. Hal Brown", "(801)595-9627"),

>   Contact("Bob Fisk", "(801)881-2260")));

>  animalList.push_back(

>   Animal("Sheldon", "parrot", "1998-09-30",

>   Contact("Dr. Kevin Wilson", "(801)466-6498"),

>   Contact("Eli Wendel", "(801)929-2506")));

>  animalList.push_pack(

>   Animal("Dippy", "penguin", "2001-06-08",

>   Contact("Dr. Barbara Swayne", "(801)459-7746"),

>   Contact("Ben Waxman", "(801)882-3549")));

>  // Сконструировать выходной архив XML и сериализовать список

>  ofstream fout("animals.xml");

>  xml_oarchive oa(fout);

>  oa << make_nvp("animalList", animalList);

>  fout.close();

>  // Сконструировать входной архив XML и десериализовать список

>  ifstream fin("animals.xml");

>  xml_iarchive ia(fin);

>  vector animalListCopy;

>  ia >> make_nvp("animalList", animalListCopy);

>  fin.close();

>  if (animalListCopy != animalList) {

>   cout << "XML serialization failed\n";

>   return EXIT_FAILURE;

>  }

> } catch (const exception& e) {

>  cout << e.what() << "\n";

>  return EXIT_FAILURE;

> }

>}

Пример 14.28. Файл animals.xml после выполнения программы из примера 14.27

>

>

>

>

3

Herby

>  elephant

>   19920423

>   Dr. Hal Brown

>   (801)595-9627

>   Bob Fisk

>   (801)881-2260

Sheldon

parrot

>   19980930

>   Dr. Kevin Wilson

>   (801)466-6498

>  

>   Eli Wendel

>   (801)929-2506

Dippy

penguin

>   20010608

>  

>   Dr. Barbara Swayne

>   (801)459-7746

>  

>   Ben Waxman

>   (801)882-3549

>

Обсуждение

Библиотека Boost Serialization обеспечивает наиболее изощренный и гибкий способ сохранения и восстановления объектов C++. Она представляет собой очень сложный фреймворк. Например, она позволяет сериализовать сложные структуры данных, содержащие циклические ссылки и указатели на полиморфные объекты. Более того, применение этой библиотеки совсем не ограничивается сериализацией XML: кроме архивов XML она предоставляет несколько типов текстовых и бинарных архивов. Архивы XML и текстовые архивы являются переносимыми, т.е. данные можно сериализовать в одной системе и десериализовать в другой; бинарные архивы не переносимы, но компактны.

Нет никаких спецификаций, которым соответствовали бы документы XML, полученные при помощи Boost.Serialization, и их формат может изменяться в новых версиях Boost. Поэтому вы не можете использовать эти документы совместно с другими фреймворками сериализации С++. Тем не менее XML-сериализация приносит пользу, потому что сериализованный вывод легко воспринимается человеком и может обрабатываться инструментальными средствами, ориентированными на XML.

Примеры 14.25 и 14.26 демонстрируют интрузивную сериализацию (intrusive serialization): классы >Animal и >Contact были модифицированы, чтобы обеспечить их сериализацию. >Boost.Serialization также поддерживает неинтрузивную сериализацию (nonintrusive serialization), обеспечивая сериализацию классов без модификации их определений при условии доступности всех состояний объекта через его открытый интерфейс. Вы уже видели пример неинтрузивной сериализации в примере 14.27: шаблон >std::vector допускает сериализацию, несмотря на то что его определение не может модифицироваться конечными пользователями. Фактически все контейнеры стандартной библиотеки являются сериализуемыми; для обеспечения сериализации контейнера, определенного в стандартном заголовочном файле >xxx, просто включите заголовочный файл boost/serialization/xxx.hpp. Дополнительную информацию о неинтрузивной сериализации вы можете найти в документации Boost.Serialization.

Примеры 14.25 и 14.26 иллюстрируют также двойственную роль оператора >&: он действует как оператор ><< при сериализации объекта и как оператор >>> при десериализации объекта. Это удобно, потому что позволяет реализовать сериализацию и десериализацию одной функцией. Однако в некоторых случаях неудобно использовать одну функцию для сериализации и десериализации; для этого в Boost.Serialization предусмотрен механизм разделения метода


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.