Д. Стефенс - C++. Сборник рецептов

Здесь есть возможность читать онлайн «Д. Стефенс - C++. Сборник рецептов» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: КУДИЦ-ПРЕСС, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

C++. Сборник рецептов: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «C++. Сборник рецептов»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «C++. Сборник рецептов», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

friend class boost::serialization::access;

template

void serialize(Archive& ar, const unsigned int version) {

// Записать (или считать) каждое данное-член в виде пары имя-значение

using boost::serialization::make_nvp;

ar & make_nvp("name", name_);

ar & make_nvp("species", species_);

ar & make_nvp("dateOfBirth", dob_);

ar & make_nvp("veterinarian", vet_);

ar & make_nvp("trainer", trainer_);

}

...

};

Теперь вы можете сериализовать 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

#include // Архив для записи XML

#include // Архив для чтения XML

#include // Средства сериализации вектора

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

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.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «C++. Сборник рецептов»

Представляем Вашему вниманию похожие книги на «C++. Сборник рецептов» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «C++. Сборник рецептов»

Обсуждение, отзывы о книге «C++. Сборник рецептов» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x