1. Сериализация и язык YAML
Тодуа Антон Романович
Научный руководитель:
к.ф.-м.н. Большакова Е.И.
Москва, 2015
2. Сериализация (Serialization)
• Процесс преобразования состояния
структур данных (объектов) в форму
удовлетворяющую условиям:
– Можно записать в файл или передать по сети
– Впоследствии возможно однозначно
восстановить исходные структуры данных
(объекты)
• Обратный процесс – десериализация
• Синоним – маршалинг (marshaling)
2 / 30
3. Подходы к сериализации
• Сериализация в текстовый формат
• Сериализация в бинарный формат
• Комбинированный подход
48:this is a simple exampe
of netstring data format,
Пример комбинированного подхода – формат netstrings
3 / 30
4. Бинарная cериализация
• Достоинства:
– Относительная простота реализации
– Высокая скорость работы
• Особенности (недостатки?):
– Зависимость от архитектуры (размеры типов,
порядок байт и т.п.)
– Формат не понятен человеку (not human-
readable)
4 / 30
5. Текстовая сериализация
• Достоинства:
– Не зависит от архитектуры
– Формат понятен человеку (human-readable)
• Особенности (недостатки?):
– Требует более сложной спецификации формата
сериализованных данных в сравнении с
бинарной сериализацией
– Скорость работы ниже, чем при использовании
бинарной сериализации
5 / 30
6. Пример: сериализация в XML формат
настроек проекта Visual Studio
<!-- часть содержимого файла ParallerSort.vcxproj -->
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>
C:Program FilesMicrosoft SDKsMPILibx86;
%(AdditionalLibraryDirectories)
</AdditionalLibraryDirectories>
<AdditionalDependencies>
msmpi.lib;%(AdditionalDependencies)
</AdditionalDependencies>
</Link>
6 / 30
7. Пример: сериализация в JSON-формат
при обмене сообщениями vk.com
[
{"ts":"1326233553","events":[]},
{"ts":"1862829303","events":
["23<!>new<!>13476570<!>200217<!>17<!>hello<!>0<!>18622"]
},
{"ts":"1384274065","events":[]}
]
{
"ts":1679655678,
"updates": [
[4,200217,17,13476570,1445805418," ... ","hello",{}],
[80,1,0],[7,13476570,200216]
]
}
Сообщения посылаемые с помощью технологии AJAX:
7 / 30
8. Пример: бинарная сериализация
неоконченной игры в пасьянс паук
Сеанс игры сохраняется в файл в
двоичном формате, структура
которого была определена
автором программы
8 / 30
11. Проблемы сериализации
• Поддержка версий данных
– Необходимо учитывать
возможность изменения
обрабатываемых структур данных
• Сериализация графа
– При обходе графа в глубину,
необходимо уметь ссылаться на
уже сериализованные узлы
A
B
C
D
11 / 30
13. Язык YAML
• YAML (первоначально Yet Another Markup
Language, сейчас – Ain't Markup Language)
• Использует кодировку Unicode
• Минималистский синтаксис
• Поддерживается современными языками
программирования
• Поддерживается современными текстовыми
редакторами
• JSON является строгим подмножеством YAML 1.2
13 / 30
14. YAML 1.2
The design goals for YAML are, in decreasing priority:
1. YAML is easily readable by humans.
2. YAML data is portable between programming
languages.
3. YAML matches the native data structures of agile
languages.
4. YAML has a consistent model to support generic tools.
5. YAML supports one-pass processing.
6. YAML is expressive and extensible.
7. YAML is easy to implement and use
http://www.yaml.org/spec/1.2/spec.html
14 / 30
16. Представление пар ключ-значение
name : Anton
age : 21
sex : male
YAML
YAML, JSON {"name" : "Anton", age : 21, "sex" : "male"}
XML
<name>Anton</name>
<age>21</age>
<sex>male</sex>
524: # студенты 524 группы
- {"name" : "Anton", age : 21, "sex" : "male"}
- {"name" : "Alexandra", age : 21, "sex" : "female"}
- {"name" : "Nikita", age : 21, "sex" : "male"}
515: # студенты 515 группы
- {"name" : "Anton", age : 22, "sex" : "male"}
- {"name" : "Yury", age : 22, "sex" : "male"}
Пример – представление списка студентов:
16 / 30
17. Представление строк
YAML, JSON
"У лукоморья дуб
зелёный;nЗлатая цепь на
дубе том:nИ днём и ночью
кот учёныйnВсё ходит по
цепи кругом;n"
two hussar : >
В 1800-х годах, в те времена, когда не было еще ни железных,
ни шоссейных дорог, ни газового, ни стеаринового света, ни
пружинных низких диванов, ни мебели без лаку, ни
разочарованных юношей со стеклышками, …
Lurkmore : |
У лукоморья дуб зелёный;
Златая цепь на дубе том:
И днём и ночью кот учёный
Всё ходит по цепи кругом;
YAML
Сохранение переносов строк:
Замена переносов строк на пробелы:
17 / 30
18. Отступы
• Используются только пробелы
• Задают вложенность примитивов
• Элементы из общей коллекции
имеют одинаковый отступ
error-example:
··- 1
·- 2 # ошибка
··- 3
# Запись JSON-строки "··onentwon·three"
# 2 задаёт размер отступа
# - означает, что в конце текста нет символа перевода строки
space-example: |2-
····one
··two
···three
18 / 30
19. Структура YAML файла
• Файл может состоять из нескольких потоков
• Поток может содержать 0 и более документов
• Маркер начала документа ‘---’
• Маркер конца потока ‘...’
# лог файл (один поток)
---
# запись 1
data : 2015-10-25 21:47:53
event : open diploma
---
# запись 2
data : 2015-10-25 21:47:58
event : close diploma
# несколько потоков
# поток 1
message: "hello"
---
message: "world"
...
# поток 2
message: "hello, world!"
...
19 / 30
20. Директивы
• Начинаются с ‘%’
• Располагаются до начала документа (‘---’)
• На данный момент определено две директивы:
# задаёт версию
%YAML 1.2
---
# документ 1
---
# документ 2
...
%YAML 1.2
---
# документ 3
Директива YAML: Директива TAG:
# определяет синоним тэга
%TAG !py! tag:yaml.org,2002:python/object:
---
# объект класса Class
- !py!__main__.Class
# аналогичное определение
- !!python/object:__main__.Class
# аналогичное определение
- !<tag:yaml.org,2002:python/object:__main__.Class>
20 / 30
21. Стандартные тэги для коллекций
• Неупорядоченная последовательность пар ключ-значение без
повторений !!map :
example: !!map { key1: val1, key2: val2, key3: val3 }
• Упорядоченная последовательность пар ключ-значение без
повторений !!omap :
example: !!omap [ one: 1, two: 2, three : 3 ]
• Упорядоченная последовательность пар ключ-значение c
возможными повторами !!pairs :
ex: !!pairs [ meeting: with team, meeting: with boss ]
• Неупорядоченное множество значений !!set :
ex: !!set { Boston Red Sox, Detroit Tigers }
• Массив значений (индексация с 0) !!seq :
ex: !!seq [ elem0, elem1, elem2, elem3, elem4 ]
21 / 30
22. Anchor и Reference
• Позволяют ссылаться на уже описанные объекты
• Anchor – задание имени описываемого объекта
• Reference – использование описываемого объекта
universities:
- &msu Lomonosov Moscow State University
- &bmstu Bauman Moscow State Technical University
students:
- name: Anton Todua
university: *msu # reference
- name: Ekaterina Scherbakova
university: *bmstu # reference
22 / 30