JavaRush /Java блог /Random UA /Формати серіалізації в Java

Формати серіалізації в Java

Стаття з групи Random UA
Вітання! Давай поговоримо про серіалізацію в Java. Ти напевно пам'ятаєш, що лекції з серіалізації ми вже мали. Ось перша А ось друга Якщо ти вже не дуже добре пам'ятаєш, як працює серіалізація, навіщо вона потрібна, і які в Java є інструменти для неї, можеш пробігтися цими лекціями. Сьогоднішня лекція буде теоретичною, і в ній ми докладніше розглянемо формати серіалізації.Формати серіалізації в Java - 1Для початку згадаємо, що таке серіалізація. Серіалізація - це процес збереження стану об'єкта в послідовність байт. Десеріалізація - це процес відновлення об'єкта з цих байт. Java-об'єкт можна серіалізувати та передати по мережі (наприклад, на інший комп'ютер). Так ось, ця послідовність байт може бути представлена ​​в різних форматах. Тобі це знайоме із повсякденного використання комп'ютера. Наприклад, електронна книга (або простий текстовий документ), яку ти читаєш, може бути записана в купі різних форматів:
  • docx (формат Microsoft Word);
  • PDF (формат Adobe);
  • mobi (зазвичай використовується у пристроях Amazon Kindle);
  • та ще багато всього (ePub, djvu, fb2...).
Здавалося б, завдання одне й те саме: представити текст у людино-читаному вигляді. Але люди винайшли цілий розсип форматів. Навіть не вдаючись до подробиць їхньої роботи, ми можемо припустити, що зроблено це не так. Ймовірно, кожен з них має свої переваги та недоліки в порівнянні з рештою. Може, й формати серіалізації були створені за тим самим принципом? Що ж, гарне припущення, студенте! :) Так воно і є. Справа в тому, що передача даних на відстань - штука досить тонка, і в ній є багато факторів. Хто передає дані? Куди? Який об'єм? Як приймаюча сторона буде людина чи машина (тобто, чи мають дані бути human-readable)? Що за пристрій читатиме дані? Очевидно, що ситуації бувають різні. Одна річ, коли потрібно передати картинку розміром 500Кб з одного смартфона на інший. І зовсім інше, коли йдеться про 500 терабайт бізнес-даних, які потрібно стиснути максимально ефективно і при цьому передати максимально швидко. Давай же познайомимося з основними форматами серіалізації та розглянемо переваги та недоліки кожного з них!

JSON

JavaScript Object Notation. З ним ти вже трохи знайомий! Ми говорабо про нього ось у цій лекції , а серіалізацію в JSON розглядали ось тут . Свою назву він одержав не просто так. Об'єкти Java, перетворені на JSON, дійсно виглядають так само, як об'єкти в мові JavaScript. Тобі зовсім не потрібно знати JavaScript, щоб зрозуміти зміст нашого об'єкта:
{
   "title": "Война и мир",
   "author": "Лев Толстой",
   "year": 1869
}
Не обов'язково передавати один об'єкт. JSON може містити і масив об'єктів:
[
 {
   "title": "Война и мир",
   "author": "Лев Толстой",
   "year": 1869
 },

 {
   "title": "Бесы",
   "author": "Федор Достоевский",
   "year": 1872
 },

 {
   "title": "Чайка",
   "author": "Антон Чехов",
   "year": 1896
 }
]
Оскільки JSON є об'єктом JavaScript, він підтримує такі формати даних JavaScript:
  • рядки (string);
  • числа (number);
  • об'єкти (object);
  • масиви (array);
  • boolean-значення (true та false);
  • null.
Які ж переваги є у JSON?
  1. Human-readable («людяно-читаний») формат. Це очевидна перевага, якщо ваш кінцевий користувач — людина. Наприклад, на сервері зберігається база даних з розкладом авіаперельотів. Чоловік запитує дані з цієї бази за допомогою веб-програми, сидячи вдома за комп'ютером. Оскільки тобі потрібно надати дані у форматі, який він зможе зрозуміти, JSON буде чудовим рішенням.

  2. Простота. Можна сказати - елементарність :) Вище ми навели приклад двох JSON-файлів. І навіть якщо ти взагалі не чув про існування JavaScript (і особливо про його об'єкти), ти легко зрозумієш, що за об'єкти там описані.
    Вся документація JSON – це одна веб-сторінка з кількома картинками.

  3. Широка поширеність. JavaScript - домінуюча мова фронтенду, і він диктує свої умови. Використання JSON – необхідність. Тому величезна кількість веб-сервісів використовують JSON як формат обміну даними. Кожна сучасна IDE підтримує JSON-формат (зокрема Intellij IDEA). Для роботи з JSON написано купу бібліотек для всіх можливих мов програмування.

Наприклад, ти вже працював з бібліотекою Jackson у лекції, де ми вчабося серіалізувати Java-об'єкти у JSON. Але окрім Jackson є, наприклад, GSON – дуже зручна бібліотека від Google.

YAML

На початку свого існування розшифровувався як Yet Another Markup Language - "ще одна мова розмітки". Тоді його позиціонували як конкурента XML. Зараз же, з часом, він розшифровується як "YAML Ain't Markup Language" ("YAML - не мова розмітки"). Що ж він із себе уявляє? Давай уявімо, що нам потрібно створити 3 класи персонажів для нашої комп'ютерної гри: Воїн, Маг і Злодій. Вони будуть такі характеристики: сила, спритність, витривалість, набір зброї. Ось як виглядатиме наш YAML-файл із описом класів:
classes:
 class-1:
   title: Warrior
   power: 8
   agility: 4
   stamina: 7
   weapons:
     - sword
     - spear

 class-2:
   title: Mage
   power: 5
   agility: 7
   stamina: 5
   weapons:
     - magic staff

 class-3:
   title: Thief
   power: 6
   agility: 6
   stamina: 5
   weapons:
     - dagger
     - poison
YAML-файл має деревоподібну структуру: одні елементи вкладені інші. Вкладеністю ми можемо керувати за допомогою деякої кількості прогалин, яким позначаємо кожен рівень. Які ж переваги має YAML-формат?
  1. Human-readable. Знову ж таки, навіть побачивши yaml-файл без опису, ти легко зрозумієш, які об'єкти там описані. YAML наскільки добре читається людиною, що головна сторінка yaml.org це звичайний yaml-файл :)

  2. Компактність. Структура файлу формується за рахунок прогалин: немає необхідності використовувати дужки або лапки.

  3. Підтримка структур даних, «рідних» мов програмування. Величезна перевага YAML перед JSON та багатьма іншими форматами полягає в тому, що він підтримує різні структури даних. В тому числі:

    • !!map
      Неупорядкований набір пар ключ: значення без можливості дублікатів;

    • !!omap
      Упорядкована послідовність пар ключ: значення без можливості дублікатів;

    • !!pairs:
      Упорядкована послідовність пар ключ: значення з можливістю дублікатів;

    • !!set
      Неупорядкована послідовність значень, які не рівні один одному;

    • !!seq
      Послідовність довільних значень;

    Деякі з цих структур знайомі тобі за Java! :) За рахунок цієї фічі у форматі YAML можна серіалізувати різні структури даних з мов програмування.

  4. Можливість використання anchor та alias

    Переклад слів "anchor" і "alias" - "якір" і "псевдонім". У принципі він досить точно описує суть цих термінів в YAML.

    Вони дозволяють тобі ідентифікувати якийсь елемент у yaml-файлі і посилатися на нього в інших частинах цього файлу, якщо він зустрічається повторно. Anchor створюється за допомогою символу &, а або за допомогою *.

    Припустимо, у нас є файл із описом книг Льва Толстого. Щоб не писати ім'я автора щоразу вручну, ми просто створимо якір «leo» і посилатимемося на нього за допомогою аліасу, коли нам це буде потрібно:

    books:
     book-1:
       title: War and Peace
       author: &leo Leo Tolstoy
       year: 1869
    
     book-2:
       title: Anna Karenina
       author: *leo
       year: 1873
    
     book-3:
       title: Family Happiness
       author: *leo
       year: 1859

    Коли ми зчитуватимемо цей файл якимось парсером, на місці нашого аліасу в потрібних місцях буде підставлятися значення «Leo Tolstoy».

  5. У YAML можна вбудувати дані в інших форматах. Наприклад, JSON:

    books: [
            {
              "title": "War and Peace",
              "author": "Leo Tolstoy",
              "year": 1869
            },
    
            {
              "title": "Anna Karenina",
              "author": "Leo Tolstoy",
              "year": 1873
            },
    
            {
              "title": "Family Happiness",
              "author": "Leo Tolstoy",
              "year": 1859
            }
          ]

Інші формати серіалізації

XML

Цей формат ґрунтується на так званому дереві тегів.
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
Кожен елемент складається з тега, що відкриває і закриває (<> і </>). Кожен елемент може мати вкладені елементи. XML — поширений формат, що не поступається JSON та YAML (якщо говорити про використання у реальних проектах). Про XML у нас є окрема лекція .

BSON (binary JSON)

Як і з його назви, дуже схожий на JSON, але не є human-readable і оперує даними в двійковому форматі. За рахунок цього він дуже зручний при зберіганні та передачі зображень та інших вкладень. Крім того, BSON підтримує деякі типи даних, недоступні у JSON. Наприклад, у BSON-файл можна записати дату (у форматі мілісекунд) або навіть шматок JavaScript коду. Популярна NoSQL база даних MongoDB зберігає інформацію саме у форматі BSON.

Position based protocol

У деяких ситуаціях нам необхідно різко знизити кількість даних, що передаються (наприклад, якщо даних дуже багато і потрібно зменшити навантаження). У цій ситуації ми можемо використовувати position based protocol , тобто передавати значення параметрів без назв самих параметрів.
"Leo Tolstoy" | "Anna Karenina" | 1873
Дані в такому форматі займають менше місця, ніж повноцінний JSON файл. Звичайно, існують і інші формати серіалізації, але тобі зараз не потрібно знати їх усі :) Добре, якщо ти будеш знайомий з тими форматами, які зараз є промисловим стандартом при розробці додатків, і пам'ятатимеш їх переваги та відмінності один від одного. А наша лекція на цьому добігла кінця:) Не забудь вирішити пару завдань сьогодні! До нових зустрічей! :)
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ