cout << 'XML serialization failed ';

   return EXIT_FAILURE;

  }

 } catch (const exception& e) {

  cout << e.what() << ' ';

  return EXIT_FAILURE;

 }

}

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

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>

<!DOCTYPE boost_serialization>

<boost_serialization signature='serialization::archive' version='3'>

<animalList class_id='0' tracking_level ='0' version='0'>

 <count>3</count>

 <item class_id='1' tracking_level='0' version='0'>

  <name>Herby</name>

  <species>elephant</species>

  <dateOfBirth class_id='2' tracking_level='0' version='0'>

   <date>19920423</date>

  </dateOfBirth>

  <veterinarian class_id='3' tracking_level='0' version='0'>

   <name>Dr. Hal Brown</name>

   <phone>(801)595-9627</phone>

  </veterinarian>

  <trainer>

   <name>Bob Fisk</name>

   <phone>(801)881-2260</phone>

  </trainer>

 </item>

 <item>

  <name>Sheldon</name>

  <species>parrot</species>

  <dateOfBirth>

   <date>19980930</date>

  </dateOfBirth>

  <veterinarian>

   <name>Dr. Kevin Wilson</name>

   <phone>(801)466-6498</phone>

  </veterinarian>

  <trainer>

   <name>Eli Wendel</name>

   <phone>(801)929-2506</phone>

  </trainer>

 </item>

 <item>

  <name>Dippy</name>

  <species>penguin</species>

  <dateOfBirth>

   <date>20010608</date>

  </dateOfBirth>

  <veterinarian>

   <name>Dr. Barbara Swayne</name>

   <phone>(801)459-7746</phone>

  </veterinarian>

  <trainer>

   <name>Ben Waxman</name>

   <phone>(801)882-3549</phone>

  </trainer>

 </item>

</animalList>

Обсуждение

Библиотека 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 предусмотрен механизм разделения метода serialize() на два отдельных метода, load() и save (). Если вам необходимо воспользоваться преимуществами этой возможности, обратитесь к документации Boost.Serialization.

В примерах 14.25, 14.26 и 14.27 я использую функцию boost::serialization::make_nvp для конструирования пар вида «имя-значение». В Boost.Serialization предусмотрен также макрос BOOST_SERIALIZATION_NVP, который позволяет выполнять сериализацию переменной, указывая ее имя. Первый компонент пары будет сконструирован автоматически препроцессором, используя оператор «стрингизации» (stringizing) # для преобразования макропараметров в строковые

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату