Чтение онлайн

ЖАНРЫ

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

};

Теперь вы можете сериализовать Animal, создавая архив XML типа

boost::archive::xml_oarchive
и записывая информацию о животном в архив, используя оператор
<<
. Конструктор
xml_oarchive
в качестве аргумента принимает
std::ostream
; часто этим аргументом будет поток вывода, используемый для записи в файл, однако в общем случае для записи данных может использоваться ресурс любого типа. После сериализации экземпляра
Animal
его можно считать обратно в память, конструируя архив XML типа boost::archive::
xml_iarchive
,
подключая его к тому же самому ресурсу, который использовался первым архивом, и применяя оператор
>>
.

Пример 14.27 показывает, как можно использовать Boost.Serialization для сохранения вектора

std::vector
, состоящего из объектов
Animal
, в файле animals.xml и затем для загрузки его обратно в память. В примере 14.28 показано содержимое файла animals.xml после выполнения программы из примера 14.27.

Пример 14.27 Сериализация вектора std::vector, состоящего из объектов Animal

#include <fstream>

#include <boost/archive/xml_oarchive.hpp> // Архив для записи XML

#include <boost/archive/xml_iarchive.hpp> // Архив для чтения XML

#include <boost/serialization/vector.hpp> // Средства сериализации вектора

#include "animal.hpp" // std::vector

int main {

 using namespace std;

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

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

 try {

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

vector<Animal> 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<Animal> 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

<?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>

Поделиться с друзьями: