cout << 'XML serialization failed
';
return EXIT_FAILURE;
}
} catch (const exception& e) {
cout << e.what() << '
';
return EXIT_FAILURE;
}
}
<?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 демонстрируют Animal
и Contact
были модифицированы, чтобы обеспечить их сериализацию. Boost.Serialization
также поддерживает std::vector
допускает сериализацию, несмотря на то что его определение не может модифицироваться конечными пользователями. Фактически все контейнеры стандартной библиотеки являются сериализуемыми; для обеспечения сериализации контейнера, определенного в стандартном заголовочном файле xxx
, просто включите заголовочный файл
Примеры 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) #
для преобразования макропараметров в строковые