Иллюстрированный самоучитель по Visual Basic .NET

TextReader, TextWriter и производные классы. Объектные потоки: сохранение и восстановление объектов.

Данные записываются в поток методами Write и WriteLine. Что касается чтения, в вашем распоряжении два способа. В наиболее распространенном варианте программа в цикле читает строки до тех пор, пока очередная прочитанная строка не окажется равной Nothing. В программе это выглядит примерно так:

Dim s As String Do
s = theStreamReader.ReadLine If Not s Is Nothing Then
' Выполнить нужные действия с s.
' Например, вызвать Console.WriteLine(s).
End If
Loop Untils Is Nothing

Также можно воспользоваться методом Peek и проверить, равен ли следующий читаемый символ -1 (признак конца файла):

Do Until theStreamReader.Peek = -1

В качестве примера использования класса TextReader ниже приводится простая процедура, предназначенная для вывода текстового файла на экран. Обратите внимание: в строках 5-17 весь важный код заключен в блок Try-Catch-Finally. В этом блоке программа пытается закрыть открытый поток независимо от того, что произошло при операциях с ним. Как упоминалось выше, перед вызовом Close в строке 16 сначала необходимо убедиться в том, что поток был успешно создан. Также обратите внимание на то, как в строке 14 к инициируемому исключению добавляется содержательное сообщение. В реальной программе следовало бы определить новый класс исключения (за подробностями обращайтесь к главе 7).

1 Sub DisplayTextFile(ByVal fName As String)
2 Dim myFile As FileStream
3 Dim textFile As StreamReader
4 Dim stuff As String
5 Try
6 myFile = New FileStream(fName.FileMode.Open, FileAccess.Read)
7 textFile = New StreamReader(myFile)
8 stuff = textFile.ReadLine()
9 Do Until stuff Is Nothing
10 Console.WriteLine(stuff)
11 stuff = textFile.ReadLine()
12 Loop
13 Catch e As Exception
14 Throw New Exception("If the file existed.it was closed")
15 Finally
16 If Not (myFile Is Nothing)Then myFile.Close()
17 End Try
18 End Sub
19 End Module

В общем случае отдельные строки файла можно сохранить в динамическом массиве ArrayList (если, конечно, количество строк относительно невелико). Для этого достаточно внести минимальные изменения в предыдущую программу. В заголовок процедуры добавляется новый параметр:

Sub DisplayTextFile(ByVal fName As String,ByVal where As ArrayList)

Строка 10 приводится к следующему виду:

where, Add(stuff)

Объектные потоки: сохранение и восстановление объектов

Объектно-ориентированное программирование вряд ли получило бы столь широкое признание, если бы программист не мог сохранить объект в текущем состоянии и восстановить его позднее. Запись объекта в поток данных называется сериализацией (serialization), а обратный процесс называется десериализацией (deserialization). В нескольких ближайших разделах мы познакомим читателя с основными принципами сериализации и десериализации.

Но прежде, чем переходить к рассмотрению новой темы, следует заметить, что это более сложная и тонкая проблема, чем кажется на первый взгляд. Почему? Одна из причин заключается в том, что объект может содержать другие объекты (вспомните классы Manager и Secretary из главы 5). Следовательно, процесс сохранения должен поддерживать рекурсивное сохранение внутренних объектов. Более того, при этом необходимо позаботиться об отсутствии дублирования.

Если на 100 программистов в отделе приходится одна секретарша, было бы нежелательно сохранять данные секретарши в 100 экземплярах, когда вполне достаточно одного экземпляра с соответствующей настройкой ссылок (нечто похожее происходит при приведении баз данных к нормальной форме с исключением избыточных данных).

К счастью, в .NET Framework сохранение объектов не требует особых усилий со стороны программиста. Как будет вскоре показано, объекты можно сохранять даже в понятном для человека формате SOAP (Simple Object Access Protocol), основанном на языке XML.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.