Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

BinaryWriter(StreamoutputStream)




BinaryReader(StreaminputStream)

Здесь параметр outputStream означает поток, в который будут записываться двоичные данные, а inputStream – поток, из которого будут считываться данные. Чтобы записать данные в файл или прочитать данные из файла, можно использовать для этих параметров объект класса FileStream.

В классе BinaryWriter определены методы, способные записывать значения всех встроенных C#-типов (некоторые из них перечислены в таблице), а также стандартные методы Close() и Flush(), работа которых описана выше.

 

Методы Описание
void Write(sbyteval) Записывает byte-значение (со знаком)
void Write(byte val) Записывает byte-значение (без знака)
void Write(byte[] buf) Записывает массивbyte-значений
void Write(short val) Записывает целочисленноеshort-значение (со знаком)
void Write(ushortval) Записывает целочисленноеushort-значение (без знака)
void Write(intval) Записывает целочисленное значение типа int
void Write(uintval) Записывает целочисленноеuint-значение (без знака)
void Write(long val) Записывает целочисленное значение типа long
void Write(ulongval) Записывает целочисленноеulong-значение (без знака)
void Write(float val) Записывает float-значение
void Write(double val) Записывает double-значение
void Write(char val) Записывает символ
void Write(char[] buf) Записывает массив символов
void Write(string val) Записывает string-значение с использованием его внутреннего формата, который включает спецификатор длины

 

В классе BinaryReader предусмотрены методы для считывания всех простых C#-типов. Наиболее часто используемые из них приведены в таблице. Также в этом классе определен стандартный метод Close().

 

Методы Описание
boolReadBoolean() Считывает bool-значение
byte ReadByte() Считывает byte-значение
sbyteReadSByte() Считывает sbyte-значение
byte[] ReadBytes(intnum) Считывает num байтов и возвращает их в виде массива
char ReadChar() Считывает char-значение
char[] ReadChars(intnum) Считывает num символов и возвращает в виде массива
double ReadDouble() Считывает double-значение
float ReadSingle() Считывает float-значение
short ReadInt16() Считывает short-значение
int ReadInt32() Считывает int-значение
long ReadInt64() Считывает long-значение
ushort ReadUInt16() Считывает ushort-значение
uint ReadUInt32() Считывает uint-значение
ulong ReadUInt64() Считывает ulong-значение
string ReadString() Считывает string-значение, представленное во внутреннем двоичном формате, который включает спецификатор длины

 

Сериализация объектов

Как уже было сказано, в пространстве имен System.IO предусмотрено множество типов, которые позволяют записывать двоичные и символьные данные в какое-то место для хранения (например, файл на диске или буфер в памяти) и считывать их. Однако среди них не существует типов, которые позволяют сохранять объекты классов целиком и затем восстанавливать их. Об этом процессе, который называется сериализацией, и пойдет речь далее.

Сериализация(serialization)– это термин, описывающий процесс преобразования объекта в линейную последовательность байтов. Обратный процесс, когда из потока байтов, содержащего всю необходимую информацию, объект восстанавливается в исходном виде, называется десериализацией (deserialization).

Чтобы можно было провести сериализацию объекта, каждый класс, который будет участвовать в сериализации, должен обладать атрибутом [Serializable]. Если же необходимо, чтобы какие-либо переменные данного класса были исключены из сериализации, достаточно просто пометить их как [NonSerialized]. Обычно так отмечаются те данные класса, которые «запоминать» не нужно (к примеру, те, которые на самом деле являются константами). Например:

[Serializable]

ClassMyClass

{

publicint x;

[NonSerialized]

private double pi = 3.14;

...

}

После этого необходимо выбрать формат, в котором будет сохранен объектный граф. По умолчанию можно использовать один из двух форматов. Класс BinaryFormatterсериализует объект в компактном потоке двоичного формата, в то время как класс SoapFormatter представляет объект как сообщение протокола SOAP (SimpleObjectAccessProtocol – простого протокола доступа к объектам) в формате XML. При необходимости можно создать свой собственный формат сериализации (и соответствующий ему объект Formatter).

Здесь рассматривается сериализация объектов в двоичном формате. Она производится при помощи класса BinaryFormatter, который определен в пространстве имен System.Runtime.Serialization.Format-ters.Binary. Для записи объекта в место хранения и восстановления объекта по сохраненной информации используются два главных метода этого класса:

 

Методы Описание
virtual object Deserialize (Stream stream) Десериализует поток байтов stream в возвращаемый объект
virtual void Serialize (Stream stream, object obj) Сериализует объект obj в поток stream

 

Пример выполнения работы

Задание. Добавить в программу предыдущей лабораторной работы возможность сохранения данных в файл и чтения из файла. Исходную коллекцию данных (массив points) необходимо сохранять в файл в двоичном виде, а также предусмотреть ее сериализацию. Коллекцию-результат (массив res) сохранить в текстовый файл.

 

Визуальное проектирование диалогового окна

Для реализации вышеуказанных действий на форму добавляется меню (компонент MenuStrip). Структура меню приведена на рисунке 4.4.

 

Рис. 4.4. Меню приложения

 

Для обеспечения возможности выбора пользователем имен файлов для открытия и сохранения в приложение необходимо добавить компоненты OpenFileDialog и SaveFileDialog. При необходимости можно указать для них фильтр (свойство Filter), например, так:

Файлы данных|*.dat|Все файлы|*.*










Последнее изменение этой страницы: 2018-06-01; просмотров: 167.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...