Тодуа. Сериализация и язык yaml

30
Сериализация и язык YAML Тодуа Антон Романович Научный руководитель: к.ф.-м.н. Большакова Е.И. Москва, 2015

Upload: -

Post on 07-Jan-2017

302 views

Category:

Education


2 download

TRANSCRIPT

Page 1: Тодуа. Сериализация и язык YAML

Сериализация и язык YAML

Тодуа Антон Романович

Научный руководитель:к.ф.-м.н. Большакова Е.И.

Москва, 2015

Page 2: Тодуа. Сериализация и язык YAML

Сериализация (Serialization)

• Процесс преобразования состояния структур данных (объектов) в форму удовлетворяющую условиям:

– Можно записать в файл или передать по сети

– Впоследствии возможно однозначно восстановить исходные структуры данных (объекты)

• Обратный процесс – десериализация

• Синоним – маршалинг (marshaling)

2 / 30

Page 3: Тодуа. Сериализация и язык YAML

Подходы к сериализации

• Сериализация в текстовый формат

• Сериализация в бинарный формат

• Комбинированный подход

48:this is a simple exampe of netstring data format,

Пример комбинированного подхода – формат netstrings

3 / 30

Page 4: Тодуа. Сериализация и язык YAML

Бинарная cериализация

• Достоинства:

– Относительная простота реализации

– Высокая скорость работы

• Особенности (недостатки?):

– Зависимость от архитектуры (размеры типов, порядок байт и т.п.)

– Формат не понятен человеку (not human-readable)

4 / 30

Page 5: Тодуа. Сериализация и язык YAML

Текстовая сериализация

• Достоинства:

– Не зависит от архитектуры

– Формат понятен человеку (human-readable)

• Особенности (недостатки?):

– Требует более сложной спецификации формата сериализованных данных в сравнении с бинарной сериализацией

– Скорость работы ниже, чем при использовании бинарной сериализации

5 / 30

Page 6: Тодуа. Сериализация и язык YAML

Пример: сериализация в 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

Page 7: Тодуа. Сериализация и язык YAML

Пример: сериализация в 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

Page 8: Тодуа. Сериализация и язык YAML

Пример: бинарная сериализациянеоконченной игры в пасьянс паук

Сеанс игры сохраняется в файл в двоичном формате, структура которого была определена автором программы

8 / 30

Page 9: Тодуа. Сериализация и язык YAML

Пример: сериализация в двоичный формат массива строк

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

Page 10: Тодуа. Сериализация и язык YAML

Пример: сериализация в YAML-форматнастроек сервиса travis-ci.org

# Файл .travis.ymllanguage: cppcompiler:

- gcc- clang

script:"sh make.sh"

branches:only:- master

10 / 30

Page 11: Тодуа. Сериализация и язык YAML

Проблемы сериализации

• Поддержка версий данных

– Необходимо учитывать возможность изменения обрабатываемых структур данных

• Сериализация графа

– При обходе графа в глубину, необходимо уметь ссылаться на уже сериализованные узлы

A

B

C

D

11 / 30

Page 12: Тодуа. Сериализация и язык YAML

Некоторые форматы сериализации

https://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats

12 / 30

Page 13: Тодуа. Сериализация и язык YAML

Язык YAML

• YAML (первоначально Yet Another Markup Language, сейчас – Ain't Markup Language)

• Использует кодировку Unicode

• Минималистский синтаксис

• Поддерживается современными языками программирования

• Поддерживается современными текстовыми редакторами

• JSON является строгим подмножеством YAML 1.2

13 / 30

Page 14: Тодуа. Сериализация и язык YAML

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

Page 15: Тодуа. Сериализация и язык YAML

Представление списков

- 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

Page 16: Тодуа. Сериализация и язык YAML

Представление пар ключ-значение

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

Page 17: Тодуа. Сериализация и язык YAML

Представление строк

YAML, JSON

"У лукоморья дуб зелёный;\nЗлатая цепь на дубе том:\nИ днём и ночью кот учёный\nВсё ходит по цепи кругом;\n"

two hussar : >В 1800-х годах, в те времена, когда не было еще ни железных,ни шоссейных дорог, ни газового, ни стеаринового света, нипружинных низких диванов, ни мебели без лаку, ниразочарованных юношей со стеклышками, …

Lurkmore : |У лукоморья дуб зелёный;Златая цепь на дубе том:И днём и ночью кот учёныйВсё ходит по цепи кругом;

YAMLСохранение переносов строк:

Замена переносов строк на пробелы:

17 / 30

Page 18: Тодуа. Сериализация и язык YAML

Отступы

• Используются только пробелы

• Задают вложенность примитивов

• Элементы из общей коллекцииимеют одинаковый отступ

error-example:··- 1·- 2 # ошибка··- 3

# Запись JSON-строки "··one\ntwo\n·three"# 2 задаёт размер отступа# - означает, что в конце текста нет символа перевода строкиspace-example: |2-····one··two···three

18 / 30

Page 19: Тодуа. Сериализация и язык YAML

Структура 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

Page 20: Тодуа. Сериализация и язык YAML

Директивы

• Начинаются с ‘%’

• Располагаются до начала документа (‘---’)

• На данный момент определено две директивы:

# задаёт версию%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

Page 21: Тодуа. Сериализация и язык YAML

Стандартные тэги для коллекций• Неупорядоченная последовательность пар ключ-значение без

повторений !!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

Page 22: Тодуа. Сериализация и язык YAML

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

Page 23: Тодуа. Сериализация и язык YAML

Стандартные тэги для скалярных типов

• Последовательность байт !!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

Page 24: Тодуа. Сериализация и язык YAML

Пример использования 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

Page 25: Тодуа. Сериализация и язык YAML

Обработка YAML файла

• Логически чтение и запись файла в YAML формате можно разделить на 3 этапа:

25 / 30

Page 26: Тодуа. Сериализация и язык YAML

Поддержка YAML текстовыми редакторами

26 / 30

Page 27: Тодуа. Сериализация и язык YAML

Поддержка 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

Page 28: Тодуа. Сериализация и язык YAML

Библиотека 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

Page 29: Тодуа. Сериализация и язык YAML

Полезные ссылки

• 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

Page 30: Тодуа. Сериализация и язык YAML

Спасибо за внимание!