Навигация
Главная
Поиск
Форум
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
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 6
На сайте нет зарегистрированных пользователей

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

Медиа плейер на Delphi + Пояснительная записка
База данных - рабочее место кассира на Delphi + бд Access
Диплом RSA, ЭЦП, сертификаты, шифрование на C#

Фактически при выводе объекта в двоичный файл на внешнем носителе осуществляется его «развертывание» в последовательность байтов
Фактически при выводе объекта в двоичный файл на внешнем носителе осуществляется его «развертывание» в последовательность байтов, а при вводе происходит обратный процесс — из последовательности байтов конструируется объект. В объектно-ориентированном программировании придумали специальный термин для обозначения этого процесса: сериализация. Сериализация это обратимый процесс преобразования произвольного набора структур данных С++ в последовательность байтов. Обратимость означает, что сериализованный объект можно снова «собрать» из последовательности байтов.
Нужно упомянуть об одной важной детали, связанной с двоичным вводом-выводом. Программа, которая считывает информацию из двоичного файла, должна «знать» размер и структуру считываемой информации. При записи в файл туда попадает только та информация, которая явно задана в операторах вывода. Никаких данных о типе выводимого значения на диске нет, если только мы сами их туда не запишем. Поэтому очень просто совершить ошибку: записать в файл объект одного типа, а прочитать записанные байты в переменную другого типа. Например, 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 April 07 2014 14:18:14 · 0 Комментариев · 3090 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Х. М. Дейтел, П. ...
Разработка Web-пр...
StartMark
SendSMS для PHP-F...
База для Allsubmi...
CoolControls v3.0...
PDF
PHP 5. Полное рук...
ProLIB18
DFileDeleter
FormShape [Исходн...
TDBF
Delphi 2005 для .NET
Шкрыль А. - Разра...
Дешифратор содерж...
CABfiles
Delphi на примерах
Создание фракталов
Программа для рис...
CaptionButton

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97832
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Есть ли у суммиров...
Структура сообщени...
должна иметь разре...
АНТИПАТТЕРНЫ ЗАПРОСОВ
Как управление изм...
Элементы управлени...
4. Какую структуру...
Если в приложении ...
Unit expected
д - Алфавитный ука...
Cannot remove curr...
Программируемая за...
Деструкторы в язы...
Биты, байты и слова
Функции
Создаем многопоточ...
Игровые автоматы. ...
Моделирование банка
О рекламе и о спаме
Удаление индекса (...
Купить ноутбук
Детская одежда
Создание потоков с...
Играйте в игровые ...
Объекты, свойства ...
Статистика



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


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