logo
Проектирование инт-прил / лекции / Проектирование инет приложений

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

Сериализация - это процесс перевода какой-либо структуры данных в последовательный набор битов. При этом при обратном процессе - десериализации - необходимо обеспечить отсутствие искажений, то есть исходный объект должен быть полностью восстановлен в его первоначальном виде. Проблема сериализации при передаче информации через сокету имеет два аспекта:

Сокета представляет собой так называемое "символьное" устройство, то есть передача информации через сокету идет побайтно. С помощью сокет могут быть соединены между собой различные платформы, имеющие разные процессоры и разные операционные системы. Но на разных платформах многобайтные данные хранятся по разному. Где-то первым идет младший байт числа, где-то - старший байт. Стандартным представлением чисел в памяти для архитектуры x86 является "остроконечный" порядок (littleendian), то есть от младшего к старшему байту,A0...An. Однако это утверждение справедливо - не для всех существующих архитектур. В то же время для передачи по сети по протоколуTPC/IPпринят "тупоконечный" порядок (bigendian), от старшего к младшему,An...A0. Из вышесказанного следует, что при попытке передать многобайтные данные через интернет с одного компьютера на другой существует вероятность получения бессмыслицы. Байт за байтом информация была передана, однако при попытке из принятых байтов составить числа или символы возможна ошибка, вызванная порядком передачи этих байт.

Для решения этой проблемы в каждом языке программирования существуют свои способы. В языке C, самом низкоуровневом из рассматриваемых в данном курсе языков программирования, существуют функцииhtonl(host-to-net-long),htons(host-to-net-short) и обратное преобразование,net-to-host. Поэтому, если Вы пишете свое интернет-приложение на языкеC, Вам придется осуществлять жесткий контроль преобразований компьютер-сеть и сеть-компьютер на каждом шаге работы с данными.

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

В высокоуровневых языках программирования проблема, конечно же, решается проще - на то они и "высокоуровневые". Например, в языке Javaсуществует интерфейсjava.io.Serializable. Это декларативный интерфейс, в нем не определено ни одного метода. Но его использование сообщает компилятору о том, что данный класс может быть передан в виде последовательности байт с использованием потоков ввода-вывода. Не обязательно через сокету, это может быть запись в файл, передача через модем и так далее - любая ситуация передачи класса в последовательном виде. При этом автоматически к собственно значению полей класса добавляется и мета-информация: что за класс передается, от какого класса он унаследован и так далее.

      1. HTML

HTML,HyperTextMarkupLanguage- так называемый "язык разметки документов ". По сути, это обычный текст. Кроме собственно содержимого, он одновременно несет в себе информацию о том, как это содержимое следует отображать или обрабатывать на стороне клиента. В настоящее время ведется работа по стандартизации версии HTML5. И, хотя окончательно принятого стандарта до сих пор не существует, большая часть современных браузеров корректно работает с рядом тэгов спецификации HTML5.

Любой документ в HTMLсостоит из элементов. Начало и конец каждого элемента обозначаются специальными пометками - тэгами, их же еще иногда называют "дескрипторы". В том числе таким элементом является и собственно документ, который заключается в тэги <HTML></HTML>. Как правило, тэги парные. То есть на каждый открывающий тэг в документе содержится точно такой же, но закрывающий, обозначающий конец элемента. Элементы могут быть пустыми, например - перевод строки, <BR />. Тэг в этом случае является одновременно и открывающим, и закрывающим. Регистр букв значения не имеет, большие и маленькие литералы обрабатываются одинаково. Поскольку окончательное форматирование отображаемого документа производится браузером, игнорируются так же и символы возврата каретки - перевода строки, а так же достаточно вольно интерпретируются символы пробела и табуляции. При необходимости браузер можно "настоятельно попросить" сделать именно так, как задумывалось. Либо при помощи тэгов (уже упоминавшийся <BR /> приведет к переводу строки в отображаемом документе). Либо при помощи так называемых "сущностей" (entities). Например, появление в документе сочетания   приведет к тому, что браузер в этом месте отобразит пробел - даже в том случае, если в этом - на взгляд браузера - и не было необходимости. Сущности позволяют отобразить на экране специальные символы. Например, © приведет к формированию на экране знака авторского права ©, < - символа "меньше" ( < ), > - символа "больше" ( > ). Появление в документе двух последних символов в их обычном виде ( <, > ) является некорректным в связи с тем, что они используются для формирования тэгов. Вообще говоря, с помощью "сущностей" можно отобразить на экране любой символ, если указать его в виде &#NNNN; где NNNN - код символа в Unicode.

Элементы могут иметь свои собственные атрибуты, которые указываются в открывающем тэге.

<A HREF="http://www.mysite.ru/hello.html">Ссылка</A>

Появление такого тэга приведет к формированию на экране ссылки - выделенной надписи, при нажатии на которую произойдет переход по указанному в атрибуте href адресу. Существуют ряд атрибутов, которые могут быть применены к любому элементу внутри документа. Это такие атрибуты, как ID,NAME,CLASS,STYLEи так далее. Другие атрибуты могут быть применены только к элементам определенного вида. Например, указанный выше HREF применяется к атрибуту A (ссылка).

Тэги могут быть вложенными. В этом случае вложенный элемент наследует атрибуты его "родителя". Пример вложенности тэгов:

<b> Этот текст будет выделен жирным шрифтом.

<i> А этот текст, кроме жирного, будет еще и наклонным шрифтом.

</i>

</b>

Поскольку спецификаций HTML, включая его расширения - XHTML(Extendedhypertextmarkuplanguage), существует несколько, то правилом хорошего тона считается первым тэгом документа указывать <!DOCTYPEточное_указание_используемой_спецификации >, однозначно сообщающий браузеру, какого типа спецификация используется в документе. Обязательным это правило не является, просто в противном случае корректность отображения всех элементов документа не гарантируется.

Язык HTML предусматривает комментарии, для чего предусмотрен специальный тэг. Символы между <!-- и --> игнорируются браузером, не отображаются на экране. Комментарий может включать в себя другие тэги, которые в этом случае также не отображаются на экране. Вложенные комментарии - недопустимы.

В общем случае документ делится на заголовок и тело. Заголовок на экране не отображается, но влияет на поведение браузера. В заголовке можно указать, разрешается ли кэшировать данную страницу, в какой кодировке ее желательно отображать, что написать в качестве заголовка окна браузера и так далее.

Ниже приведен пример HTML-документа.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>

<head>

<title>Пример страницы</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

</head>

<body>

<h1 align="center">Пример страницы</h1>

<!-- Меню -->

<div>Меню</div>

</body>

</html>