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

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

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

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Пример 14.25. Добавление поддержки сериализации в класс Contact из примера 14.2

#include // пара "имя-значение"

class Contact {

...

private:

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("phone", phone_);

}

...

};

Аналогично можно обеспечить сериализацию класса Animalиз примера 14.2, как это сделано в примере 14.26.

Пример 14.26. Добавление поддержки сериализации для класса Animal из примера 14.2

...

// Включить поддержку сериализации для boost::gregorian::date

#include

...

class Contact {

...

private:

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.

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

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

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x