Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

Пользователей: 13,139
новичок: atlantix
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование информационно-поисковой библиографической системы на gpss ...
Моделирование процесса обеспечивающего надежность функционирования АСУ Т...
Программа тестирования (тест) - вступительные экзамены (математика, физи...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Фактически при выводе объекта в двоичный файл на внешнем носителе осуществляется его «развертывание» в последовательность байтов
Фактически при выводе объекта в двоичный файл на внешнем носителе осуществляется его «развертывание» в последовательность байтов, а при вводе происходит обратный процесс — из последовательности байтов конструируется объект. В объектно-ориентированном программировании придумали специальный термин для обозначения этого процесса: сериализация. Сериализация это обратимый процесс преобразования произвольного набора структур данных С++ в последовательность байтов. Обратимость означает, что сериализованный объект можно снова «собрать» из последовательности байтов.
Нужно упомянуть об одной важной детали, связанной с двоичным вводом-выводом. Программа, которая считывает информацию из двоичного файла, должна «знать» размер и структуру считываемой информации. При записи в файл туда попадает только та информация, которая явно задана в операторах вывода. Никаких данных о типе выводимого значения на диске нет, если только мы сами их туда не запишем. Поэтому очень просто совершить ошибку: записать в файл объект одного типа, а прочитать записанные байты в переменную другого типа. Например, i nt и f loat в системе Visual C++.NET 2003 занимают в памяти одинаковое количество байтов — четыре. Поэтому в приведенных ранее примерах (см. листинг 14.7) можно было бы записать На диск массив дробных чисел типа float, а считывать его как массив целых чисел. Никаких сообщений об ошибках, естественно, не выдается; программа может даже работать, но результат, как вы понимаете, будет абсолютно неверным. Поэтому функции ввода-вывода обычно разрабатываются «парами»: одна — для записи в файл, другая — для чтения из файла.
Никто не знает структуру объекта лучше, чем сам объект. Поэтому, если требуется сохранить объект на диске, можно в классе реализовать два метода: save() и load(). Методы save() и load(), очевидно, должны быть симметричными — процесс сериализации должен быть обратимым. Эти методы должны работать с полями объекта. Например, для класса TDate (см. далее раздел «Перегрузка операций ввода-вывода») требуется выводить поля
unsigned long date; static fmtflags fmt;



Один из вариантов реализации методов save() и load() позволяет создать «моментальный снимок» объекта во внешней памяти, который в дальнейшем можно восстановить. Прототипы методов выглядят просто:
void saveQ ; void load();



В методе save() нужно определить локальный выходной поток и открыть его как двоичный. Поток, естественно, должен быть связан с файлом, который метод load () через свой локальный поток должен открывать как входной. Поэтому оба метода должны как-то получить доступ к одному и тому же имени файла. Очевидно, что этот файл может быть временным. Так как имя файла не должно совпадать с именем никакого другого файла, файл можно создать с помощью стандартной функции tmpnam() из библиотеки <cstdio>. Прототип функции:
char *tmpnam(char *s);



В качестве аргумента можно задать массив символов, тогда имя будет сгенерировано в нем. Назначение метода save() понятно, и написать его несложно.
Единственная проблема — передать информацию об имени файла в метод load (). Это проще всего сделать, определив в классе поле, представляющее собой символьный массив, например:
char name[13];



Тогда метод saveQ будет заносить в это поле имя, сгенерированное функцией tmpnam(), а метод load() — открывать файл с этим именем.
Ввод-вывод скалярных объектов относительно прост, так как поля в классе известны и занимают фиксированное количество байтов. Значительно сложнее запрограммировать сериализацию динамических контейнеров, ведь требуется выводить не указатели, а значения, записанные в динамической памяти. Например, для динамического массива ТАггау (см. листинг 6.10) требуется выводить поле-размер size_array и само содержимое динамического массива, расположенного по адресу, записанному в поле-указателе data.
Опубликовал Kest Апрель 07 2014 18:18:14 · 0 Комментариев · 2145 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
NotePad Pro [Исхо...
AID антивирус
Основы Delphi. Пр...
LaserTank [Исходн...
Visual Basic for ...
Abc_component
DS_Group
Crypt32
Игра Car [Исходни...
Сапёр
В.Понамарев - COM...
MP3 Архив v.2.0
CoolDev TipsSyste...
FatScrollbar
TDBF
Delphi. Готовые а...
Printgrid
Задача о 8ми ладьях
MiniChat
Проигрыватель Mp3

Топ загрузок
Приложение Клие... 100634
Delphi 7 Enterp... 94492
Converter AMR<-... 20163
GPSS World Stud... 16363
Borland C++Buil... 13630
Borland Delphi ... 9590
Turbo Pascal fo... 7195
Калькулятор [Ис... 5424
Visual Studio 2... 5093
FreeSMS v1.3.1 3600
Случайные статьи
File not assigned
Расчет токов корот...
Установка и удален...
Local object types...
Ликбез по meta-тег...
кол источника исто...
Быстрая индексация...
Узбекские песни ск...
Итоги
Функции
Ввод и вывод строк
6.5. Создание стр...
Структурная обрабо...
Игры
Index TOP 20 (дохо...
Защита учетной зап...
Оказывается, в Инт...
Назначение и особе...
Игра «Крестики нол...
Гостевая книга на PHP
Использование кома...
Целые числа со зна...
Печать русских бук...
Программирование с...
Маршалер свободной...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?