Введення-виведення типізованих даних

Розглянуті вище потокові класи є зручними для переміщення даних як послідовності байтів. Однак вони недостатньо ефективні для операцій над даними. Наприклад, щоб отримати з файла ціле число типу int, необхідно прочитати 4 байти в масив байтів, який після цього потрібно інтерпретувати як ціле.

Щоб забезпечити більш структурований доступ до даних із потоків, у просторі System.IO розташовано кілька класів для зчитування та запису даних.

Введення-виведення двійкових даних

Клас BinaryWriter призначений для запису значення типізованої змінної в потік. Конструктор класу має такий синтаксис:

BinaryWriter([Stream output,

[Encoding encoding]]);

Параметр output зазначає потік, з яким працюватиме клас. Параметр encoding дає змогу під час виводу символьних Введення-виведення типізованих даних даних в потік конвертувати їх в інші кодові формати.

Наступний код демонструє використання класу

BinaryWriter:

FileStream fs=File.Create (@"c: \temp\file.dat") ;

BinaryWriter bw = new BinaryWriter(fs);

bw.Write((float) 3.14);

int i = 10;

bw.Write (i);

string s = "стрічка";

bw.Write (s);

bw.Flush();

bw.Close();

Клас BinaryWriter має єдину властивість BaseStream, яка повертає потік, в який пише об' єкт класу.

Перелічимо загальнодоступні методи класу BinaryWriter:

Метод Зшст
Close Закриває об'єкт класу та відповідний йому потік
Flush Записує всі дані з буфера у сховище даних потоку
Seek Установлює позицію в потоці
Write Записує типізоване значення в потік

Зазначимо, що Введення-виведення типізованих даних метод Write сильно перевантажений, оскільки підтримує запис більшості основних типів даних.

Клас BinaryReader призначений для читання даних з потоку в типізовані змінні. Конструктор класу має такий синтаксис:

BinaryReader(Stream input, [Encoding encoding]);

Параметр input визначає потік, з яким працюватиме клас. Необов'язковий параметр encoding дає змогу у процесі читання символьних даних з потоку конвертувати їх в інші кодові формати.

Наступний код демонструє використання класу BinaryReader:

FileStream fs =

File.OpenRead(@"c:\temp\file.dat");

BinaryReader br = new BinaryReader(fs);

float f = br.ReadSingle();

int i = br.ReadInt32();

string s = br.ReadString();

br.Close();

Клас BinaryReader має єдину властивість BaseStream Введення-виведення типізованих даних, яка повертає потік, з якого читає об'єкт класу.

Призначення наступних методів класу очевидне з назви: Close, ReadBoolean, ReadByte, ReadBytes, ReadChar, ReadChars, ReadDecimal, ReadDouble, ReadInt16, ReadInt32, ReadInt64, ReadSByte, ReadSingle, ReadString, ReadUInt16, ReadUInt32, ReadUInt64. Окрім перелічених клас має ще два методи: PeekChar повертає наступний символ, не змінюючи позиції в потоці, а Read повертає символі змінює позицію.

Читання та запис тексту

Класи FileStream, BinaryReader та BinaryWriter використовують для читання та запису текстових файлів. Однак, з метою підвищення ефективності та зручності програмування, доцільно використовувати для роботи з текстом спеціальні класи, які є нащадками абстрактних класів TextReader та TextWriter. Методи цих класів вміють читати та Введення-виведення типізованих даних записувати стрічку, тобто набір символів, який завершується комбінацією „по­вернення каретки - переведення стрічки" ((char) 13 (char) 10). Окрім цього, класи автоматично розпізнають і підтримують задане у файлі кодування символів (ASCII, Unicode, UTF7, UTF8).

Наведемо деякі загальнодоступні методи класу TextReader:

Метод Зміст
Close Закриває об' єкт і звільняє зайняті ним ресурси
Peek Повертає наступний символ без зміни позиції
Read Читає символи з відповідного об'єктові потоку
ReadBlock Читає буфер з відповідного об'єктові потоку
ReadLine Читає стрічку символів з відповідного об'єктові потоку
ReadToEnd Читає символи від поточної позиції до кінця потоку
Клас TextWriter має такі методи:
Метод Зміст Введення-виведення типізованих даних
Close Закриває об' єкт і звільняє зайняті ним ресурси
Flush Записує всі дані з буфера у сховище даних
Write Записує символи у відповідний об'єктові потік
WriteLine Записує стрічку у відповідний об' єктові потік
Клас TextWriter має також властивості:
Властивість Зміст
Encoding Повертає поточне кодування тексту
FormatProvider Повертає об'єкт із урахуванням культурозалежних
аспектів форматування
NewLine Повертає або встановлює послідовність символів, які
означають кінець стрічки тексту



Реалізацією класів TextReader та TextWriter для роботи з потоками є класи StreamReader та StreamWriter.

Узагальнена схема конструктора класу StreamReader має такий вигляд:

public StreamReader(

Stream stream | string path [, Encoding encoding

[, bool detectEncodingFromByteOrderMarks [, int bufferSize]] ]);

Зазначимо, що Введення-виведення типізованих даних схема не охоплює синтаксис усіх конструкторів класу. Режим і тип доступу не використовують, оскільки клас призначений лише для читання.

Клас StreamReader може читати дані з файла (параметр path) або з іншого потоку (параметр stream).

Параметр encoding задає метод кодування.

Параметр detectEncodingFromByteOrderMarks

зазначає, чи шукати ознаку кодування символів у файлі (потоці).

Параметр bufferSize задає мінімальний розмір буфера для читання.

Екземпляр класу StreamReader можна також отримати з інших класів. Наприклад, екземпляр цього класу повертають методи OpenText і CreateText класу FileInfo.

Клас StreamWriter працює практично так само, як і StreamReader, тільки використовується для запису у файл або інший потік. Конструктори класу StreamWriter використовують Введення-виведення типізованих даних ті ж параметри, що й конструктори класу StreamReader.

Наступний код демонструє використання класів StreamReader і StreamWriter:

FileStream fs = File.Create(@"e:\File.txt");

//Запис у файл

StreamWriter sw = new StreamWriter(fs);

sw . WriteLine ( "Записано класом StreamWriter.");

sw.Flush();

sw.Close();

//Читання з файла

StreamReader sr = new

StreamReader(@"e:\File.txt") ;

MessageBox.Show(sr.ReadLine());

sr.Close();

Класи StringReader і StringWriter також є дочірніми для класів TextReader і TextWriter. Сховищем даних для цих класів є стрічка. Класи StringReader і StringWriter мають такі ж методи та властивості, як і класи StreamReader - StreamWriter. Додатково клас StreamWriter має метод GetStringBuilder, який повертає об'єкт класу StringBuilder.

Модифікуємо Введення-виведення типізованих даних попередній код під використання класів StringReader і StringWriter:

StringBuilder sb = new StringBuilder();

//Запис у стрічку

StreamWriter sw = new StreamWriter(sb); sw.WriteLine ("Записано класом StreamWriter."); sw.Close (); //Читання зі стрічки StreamReader sr = new

StreamReader(sb.ToString()); MessageBox.Show(sr.ReadToEnd()); sr.Close();

Серіалізація

Серіалізація - це процес перетворення даних об'єкта у формат, який можна зберігати або транспортувати. Серіалізація дає змогу записати об'єкт у сховище даних з допомогою потоку. Зворотний процес - відновлення об'єкта з допомогою потоку зі сховища даних - називають десеріалізацією.

Серіалізувати можна лише об'єкти класів, які перед своїм оголошенням містять атрибут [Serializable]. .NET надає дві технології серіалізації Введення-виведення типізованих даних.

Бінарна (двійкова) серіалізація передбачає збереження точної копії об'єкта. Це може бути корисним для відтворення об'єкта в різних сеансах роботи програми, для передавання між різними програмами та мережею. З метою відтворення бінарно серіалізованого об'єкта програма повинна знати його тип. У випадку бінарної серіалізації об'єкт-десеріалізатор залежний від версії модуля, у якому серіалізовано стан відповідного об' єкта.

Наступна схема демонструє процес бінарної серіалізації- десеріалізації.

//клас Sample будемо серіалізувати [Serializable] public class Sample { public string Title;

}

//фрагмент коду серіалізації Sample obj = new Sample(); obj.Title = "Об'єкт класу Sample"; FileStream writer = new FileStream ("c:\\Sample.dat", FileMode Введення-виведення типізованих даних.Create);

BinaryFormatter bf = new BinaryFormatter(); //бінарна серіалізація bf.Serialize(writer, obj); writer.Close();

//фрагмент коду десеріалізації FileStream reader = new

FileStream("c:\\Sample.dat", FileMode.Open); Sample newobj =

(Sample)bf.Deserialize(reader);

Клас BinaryFormatter оголошений у просторі імен System.Runtime.Serialization.Formatters.Binary.

XML-серіалізація дає змогу зберегти лише загальнодоступні властивості та поля. Здебільшого цього достатньо для смислового відтворення об'єкта. Оскільки XML - відкритий стандарт, XML- серіалізація є хорошим засобом спільного використання даних у мережі. У випадку XML-серіалізації проблема версійності складеного модуля, яким виконано серіалізацію стану об' єкта, не виникає. Проте необхідно зважати на суттєве зростання пакетів серіалізованої інформації (до об Введення-виведення типізованих даних'єму даних додається суттєвий об'єм XML-розмітки).

XML-серіалізація може бути виконана, наприклад, наступним кодом:

XmlSerializer ser = new

XmlSerializer(typeof(Sample)); TextWriter writer = new

StreamWriter("c:\\Sample.xml"); ser.Serialize(writer, obj); writer.Close();

Клас XmlSerializer оголошений у просторі імен System. Xml.Serialization.

Різновидом-XML серіалізації є SOAP серіалізація, яка використовує відкритий стандарт SOAP. Для її реалізації можна використати спеціалізований клас SoapFormatter, оголошений у просторі імен System.Runtime.Serialization.

Formatters.Soap.


ДОДАТКИ


documentbboynwb.html
documentbboyvgj.html
documentbbozcqr.html
documentbbozkaz.html
documentbbozrlh.html
Документ Введення-виведення типізованих даних