Перетворення двійкового потоку в текстовий потік в Visual C # (Sharp)

Перетворення двійкового потоку в текстовий полягає у створенні за допомогою проставляється NET форматера примірника Ticket, який потім перетвориться

в текст Дале е приведе н вихідними й ко д дл я виконаних ї всі х ці х кроків (Дл я пра – вильно й робіт и код а В Binary2Text необхідний про создат ь Лінк у на LottoLibrary)

using System 10

using SystemRuntimeSerializationFormattersBinary

namespace Binary2Text {

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

StringBuilder builder = new StringBuilder()

try {

while (true) {

BinaryFormatter formatter = new BinaryFormatter() LottoLibraryTicket ticket =

(LottoLibraryTicket)formatterDeserialize(input)

builderAppendFormat(

&quot{0}{1}{2} {3} {4} {5} {6} {7} {8} {9}\n&quot,

ticketDrawDateYear, t icketDrawDateMonth, ticketDrawDateDay, ticketNumbers[0], ticketNumbers[1], ticketNumbers[2], ticketNumbers[3], ticketNumbers[4], ticketNumbers[5], ticketBonus)

}

}

catch (Exception e) {

}

outputWrite(builderToString()).

}

}

}

У код е двійкову й пото до счітиваетс я классо м BinaryFormatter, якому й читає т ти п и з потік а даних Зверне е внимани е н а то т факт, чт про мето д Deserialize () н е запитує, како ї ти п нужн про зчитувати, т к вся пов а информаци я содержітс я в потоці Мето д Deserialize () зчитувати т обєкт, асоціюючи т ег про з типом, созда – е т примірниках р і привласнювати т значени я члена м даних

Жирним шрифтом в коді вказані проблемні місця в процесі десеріалізіі, що зводяться до того, коли зчитувати який тип При обробці обєктом BinaryFormatter двійковий потік зчитує і записує обєкти Обєкт BinaryFormatter створює екземпляр всього, що він виявляє, і вважає, що викликає його код знає, який тип обробляється Якщо ж викликає код не знає цього, то викидається виключення, т к приведення до специфічних типу буде невдалим

Блок обробки виключення необхідний тому, що ми не знаємо, скільки обєктів Ticket було збережено, т к приводу не записується в потік За допомогою властивостей Position (позиція) і Length (довжина) визначається, чи є ще екземпляри, котие потрібно прочитати але ці властивості застосовні лише до файлів У довічних потоках консолі немає ні довжини, ні позиції Тому єдиним рішенням яяется продовжувати зчитування до тих пір, поки це можливо, після чого вважати, що обробка завершена

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

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

А форматі р довічного потоку може бути ще більш складним Погляньте ещ е раз на рис 108 і зверніть увагунате, що інформація про тип і ідентифікатор и веіі зберігаються в потоці Тепер уявіть собі ситуацію, в якій створюється збірка, яка зберігає певні обєкти Потім, кілька ле т і кілька веій програм и потому, робиться спроба завантажити файл Спроба буде невдалою, т к версія типу більше не існує Тому розумним підходом буде т дл я двчного форматер а не створювати версію неіснуючого типу, тому що це плекло б за собою проблеми з сериализацией

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*