View
291
Download
2
Category
Preview:
Citation preview
Сериализация и язык YAML
Тодуа Антон Романович
Научный руководитель:к.ф.-м.н. Большакова Е.И.
Москва, 2015
Сериализация (Serialization)
• Процесс преобразования состояния структур данных (объектов) в форму удовлетворяющую условиям:
– Можно записать в файл или передать по сети
– Впоследствии возможно однозначно восстановить исходные структуры данных (объекты)
• Обратный процесс – десериализация
• Синоним – маршалинг (marshaling)
2 / 30
Подходы к сериализации
• Сериализация в текстовый формат
• Сериализация в бинарный формат
• Комбинированный подход
48:this is a simple exampe of netstring data format,
Пример комбинированного подхода – формат netstrings
3 / 30
Бинарная cериализация
• Достоинства:
– Относительная простота реализации
– Высокая скорость работы
• Особенности (недостатки?):
– Зависимость от архитектуры (размеры типов, порядок байт и т.п.)
– Формат не понятен человеку (not human-readable)
4 / 30
Текстовая сериализация
• Достоинства:
– Не зависит от архитектуры
– Формат понятен человеку (human-readable)
• Особенности (недостатки?):
– Требует более сложной спецификации формата сериализованных данных в сравнении с бинарной сериализацией
– Скорость работы ниже, чем при использовании бинарной сериализации
5 / 30
Пример: сериализация в XML форматнастроек проекта Visual Studio
<!-- часть содержимого файла ParallerSort.vcxproj --><Link><SubSystem>Console</SubSystem><GenerateDebugInformation>true</GenerateDebugInformation><AdditionalLibraryDirectories>C:\Program Files\Microsoft SDKs\MPI\Lib\x86;%(AdditionalLibraryDirectories)
</AdditionalLibraryDirectories><AdditionalDependencies>msmpi.lib;%(AdditionalDependencies)
</AdditionalDependencies></Link>
6 / 30
Пример: сериализация в 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 / 30
Пример: сериализация в двоичный формат массива строк
typedef std::vector<std::string> CData;CData test;test.push_back( "anton" );test.push_back( "todua" );test.push_back( "524" );
void Serialize( std::ostream& stream, const CData& data ){
std::size_t size;size = data.size();stream.write( (char*)&size, sizeof( std::size_t ) );for( std::size_t i = 0; i < data.size(); i++ ) {
size = data[i].length();stream.write( (char*)&size, sizeof( std::size_t ) );stream.write( data[i].data(), data[i].length() );
}} 9 / 30
Пример: сериализация в YAML-форматнастроек сервиса travis-ci.org
# Файл .travis.ymllanguage: cppcompiler:
- gcc- clang
script:"sh make.sh"
branches:only:- master
10 / 30
Проблемы сериализации
• Поддержка версий данных
– Необходимо учитывать возможность изменения обрабатываемых структур данных
• Сериализация графа
– При обходе графа в глубину, необходимо уметь ссылаться на уже сериализованные узлы
A
B
C
D
11 / 30
Некоторые форматы сериализации
https://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats
12 / 30
Язык YAML
• YAML (первоначально Yet Another Markup Language, сейчас – Ain't Markup Language)
• Использует кодировку Unicode
• Минималистский синтаксис
• Поддерживается современными языками программирования
• Поддерживается современными текстовыми редакторами
• JSON является строгим подмножеством YAML 1.2
13 / 30
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.html14 / 30
Представление списков
- item 1- item 2- item 3- item 4
YAML
YAML, JSON ["item 1", "item 2", "item 3", "item 4"]
XML
<nodes><node>item 1</node><node>item 2</node><node>item 3</node><node>item 4</node>
</nodes>
- [5, 3, 0, 0, 7, 0, 0, 0, 0]- [6, 0, 0, 1, 9, 5, 0, 0, 0]- [0, 9, 8, 0, 0, 0, 0, 6, 0]- [8, 0, 0, 0, 6, 0, 0, 0, 3]- [4, 0, 0, 8, 0, 3, 0, 0, 1]- [7, 0, 0, 0, 2, 0, 0, 0, 6]- [0, 6, 0, 0, 0, 0, 2, 8, 0]- [0, 0, 0, 4, 1, 9, 0, 0, 5]- [0, 0, 0, 0, 8, 0, 0, 7, 9]
Пример – представление судоку:
15 / 30
Представление пар ключ-значение
name : Antonage : 21sex : 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
Представление строк
YAML, JSON
"У лукоморья дуб зелёный;\nЗлатая цепь на дубе том:\nИ днём и ночью кот учёный\nВсё ходит по цепи кругом;\n"
two hussar : >В 1800-х годах, в те времена, когда не было еще ни железных,ни шоссейных дорог, ни газового, ни стеаринового света, нипружинных низких диванов, ни мебели без лаку, ниразочарованных юношей со стеклышками, …
Lurkmore : |У лукоморья дуб зелёный;Златая цепь на дубе том:И днём и ночью кот учёныйВсё ходит по цепи кругом;
YAMLСохранение переносов строк:
Замена переносов строк на пробелы:
17 / 30
Отступы
• Используются только пробелы
• Задают вложенность примитивов
• Элементы из общей коллекцииимеют одинаковый отступ
error-example:··- 1·- 2 # ошибка··- 3
# Запись JSON-строки "··one\ntwo\n·three"# 2 задаёт размер отступа# - означает, что в конце текста нет символа перевода строкиspace-example: |2-····one··two···three
18 / 30
Структура YAML файла
• Файл может состоять из нескольких потоков
• Поток может содержать 0 и более документов
• Маркер начала документа ‘---’
• Маркер конца потока ‘...’
# лог файл (один поток)---# запись 1data : 2015-10-25 21:47:53event : open diploma---# запись 2data : 2015-10-25 21:47:58event : close diploma
# несколько потоков# поток 1message: "hello"---message: "world"...# поток 2message: "hello, world!"...
19 / 30
Директивы
• Начинаются с ‘%’
• Располагаются до начала документа (‘---’)
• На данный момент определено две директивы:
# задаёт версию%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
Стандартные тэги для коллекций• Неупорядоченная последовательность пар ключ-значение без
повторений !!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
Anchor и Reference
• Позволяют ссылаться на уже описанные объекты
• Anchor – задание имени описываемого объекта
• Reference – использование описываемого объекта
universities:- &msu Lomonosov Moscow State University- &bmstu Bauman Moscow State Technical University
students:- name: Anton Toduauniversity: *msu # reference
- name: Ekaterina Scherbakovauniversity: *bmstu # reference
22 / 30
Стандартные тэги для скалярных типов
• Последовательность байт !!binary
• Логическое значение !!bool
• Число с плавающей точкой !!float
• Целое число !!int
• Пустое значение !!null
• Unicode строка !!str
• Дата !!timestamp :
- &CENTER { x: 1, y: 2 }- &LEFT { x: 0, y: 2 }- &BIG { r: 10 }- &SMALL { r: 1 }# Эквивалентные объекты:- x: 1y: 2r: 10label: center/big
- << : *CENTERr: 10label: center/big
- << : [*CENTER, *BIG]label: center/big
- << : [*BIG, *LEFT, *SMALL]x: 1label: center/big
# canonical- 2001-12-15T02:59:43.1Z# valid iso8601- 2001-12-14t21:59:43.10-05:00# space separated:- 2001-12-14 21:59:43.10 -5# no time zone (Z)- 2001-12-15 2:59:43.10#date (00:00:00Z)- 2002-12-14
• Слияние !!merge (‘<<’):
23 / 30
Пример использования anchor и reference
(let* ((x '(3 4 5))(y (cons 2 x))(z (cons 1 y))))
1
2
3
4
5
x
y
z
x: &xcar: 3cdr:
car: 4cdr:
car: 5cdr: nil
y: &ycar: 2cdr: *x
z:car: 1cdr: *y
Lisp-список:
Представление в памяти:
Представление в YAML:
24 / 30
Обработка YAML файла
• Логически чтение и запись файла в YAML формате можно разделить на 3 этапа:
25 / 30
Поддержка YAML текстовыми редакторами
26 / 30
Поддержка YAML языками программирования
• C++ (https://github.com/jbeder/yaml-cpp)
• C (http://pyyaml.org/wiki/LibYAML)
• C#/.NET (http://yaml-net-parser.sourceforge.net)
• Haskell (http://hackage.haskell.org/package/YamlReference)
• JavaScript (http://nodeca.github.io/js-yaml)
• Python (http://pyyaml.org)
• PHP (https://code.google.com/p/php-yaml)
• Ruby (https://github.com/tenderlove/psych)27 / 30
Библиотека yaml-cpp
#include <yaml-cpp/yaml.h> // Подключение библиотеки.YAML::Node db = YAML::LoadFile( "students.yml" );YAML::Node students = db["students"];for( auto i = students.begin(); i != students.end(); ++i ) {
std::cout << (*i)["name"] << " from "<< (*i)["university"] << std::endl;
}
universities:- &msu Lomonosov Moscow State University- &bmstu Bauman Moscow State Technical University
students:- { name: Anton Todua, university: *msu }- { name: Ekaterina Scherbakova, university: *bmstu }
28 / 30
Полезные ссылки
• https://en.wikipedia.org/wiki/Serialization
• https://en.wikipedia.org/wiki/JSON
• https://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats
• https://en.wikipedia.org/wiki/YAML
• http://www.yaml.org/
• http://www.yaml.org/spec/1.2/spec.html
• http://pyyaml.org/wiki/LibYAML
• https://github.com/jbeder/yaml-cpp
29 / 30
Спасибо за внимание!
Recommended