Главная » C# » Преобразование двоичного потока в текстовый поток в Visual C# (Sharp)

0

Преобразование двоичного потока в текстовый состоит в создании с помощью проставляемого  .NET форматера экземпляра Ticket, который затем  преобразуется

в  текст .  Дале е  приведе н  исходны й  ко д  дл я  выполнени й   все х  эти х  шагов .  (Дл я  пра – вильно й  работ ы  код а  В Binary2Text необходим о создат ь  ссылк у  на  LottoLibrary.)

using System. 10;

using System.Runtime.Serialization.Formatters.Binary;

namespace Binary2Text {

class LottoTicketProcessor : IBinary2TextProcessor { public void Process(Stream input, TextWriter output) {

StringBuilder builder = new StringBuilder();

try {

while (true) {

BinaryFormatter formatter = new BinaryFormatter(); LottoLibrary.Ticket ticket =

(LottoLibrary.Ticket)formatter.Deserialize(input);

builder.AppendFormat(

"{0}.{1}.{2} {3} {4} {5} {6} {7} {8} {9}\n",

ticket.DrawDate.Year, t icket.DrawDate.Month, ticket.DrawDate.Day, ticket.Numbers[0], ticket.Numbers[1], ticket.Numbers[2], ticket.Numbers[3], ticket.Numbers[4], ticket.Numbers[5], ticket.Bonus);

}

}

catch (Exception e) {

}

output.Write(builder.ToString());.

}

}

}

В  код е  двоичны й  пото к  считываетс я  классо м  BinaryFormatter, которы й  читае т ти п и з поток а данных . Обратит е внимани е н а то т факт , чт о мето д Deserialize ( ) н е спрашивает ,    како й   ти п   нужн о   считывать ,   т .  к .    вся   эт а   информаци я   содержитс я в  потоке .  Мето д  Deserialize ()   считывае т  объект ,  ассоциируе т  ег о  с  типом ,  созда – е т  экземпля р  и  присваивае т  значени я  члена м  данных .

Жирным шрифтом в коде указаны проблемные  места  в  процессе  десериализии, сводящиеся к тому, когда считывать какой тип. При обработке объектом BinaryFormatter двоичный поток считывает и записывает объекты. Объект BinaryFormatter создает экземпляр всего, что он обнаруживает, и полагает, что вызывающий его код знает, который  тип  обрабатывается.  Если  же  вызывающий код не знает этого, то выбрасывается исключение, т. к. приведение к специфичну типу будет неудачным.

Блок обработки исключения необходим потому, что мы не знаем, сколько объектов Ticket было сохранено, т. к. счет не записывается в поток. С помощью свойств Position (позиция) и Length (длина) определяется, есть ли еще экземпляры, котые нужно прочитать; но эти свойства применимы только  к файлам. В двоичных потоках консоли нет ни длины, ни позиции. Поэтому единственным решением яяется продолжать считывание до тех пор, пока это возможно, после чего полагать, что обработка завершена.

НАМЕРЕНИЕ       И       РЕАЛИЗАЦИЯ

Может показаться, что факт разного поведения Position и Length в зависимост и от реализации нарушает контракт, требующи й разделения намерения от реализации. Впечатление нарушения парадигмы компонентного ПО возникает потому, что, как разработчику, вам необходимо знать, каким образом реализован поток. Но в действельности,  правило  не  нарушается,  а  только делается  исключение  из  него,  т.  к.  иногда у нас просто нет другого выбора. Файловы й и консольный потоки имею т много общих характеристик, но известная длина не является  одной  из  этих  характеристик.  В  приипе  можно  заставить  консольный  поток  предоставить   определенное   значение,   но было бы неправильным делать это. Более разумным подходом, который и избрали разработчики   .NET,  будет  сгенерировать  исключение.

А формате р двоичного потока  может быть  еще  более  сложным.  Взгляните  ещ е  раз  на рис. 10.8 и обратите  внимание  на  то,  что  информация  о  типе  и  идентификатор ы  веии сохраняются в потоке. Теперь представьте себе ситуацию, в которой  создается сборка, сохраняющая определенные  объекты.  Потом,  несколько  ле т  и  несколько  веий  программ ы  спустя,  делается  попытка  загрузить  файл.   Попытка  будет  неудачной, т. к. версия типа больше не существует. Поэтому разумным подходом  буде т дл я  двчного форматер а не создавать версию несуществующего типа, потому  что  это  плекло  бы  за  собой  проблемы  с сериализацией.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии