1. Навіщо взагалі обирати формат? Коротке нагадування
Будь-який об’єкт .NET у пам’яті — це набір адрес, посилань, полів, внутрішніх структур — уся ця «машинна кухня». Але так у файл його не збережете: файли мають бути структуровані у форматі, який уміють читати (і бажано писати) не лише ми, а й інші програми. Ось тут і з’являється вибір формату серіалізації.
Основні завдання формату серіалізації:
- Компактність: місце на диску або швидкість передавання мережею.
- Читабельність (для людини!): чи можна відкрити файл у текстовому редакторі й зрозуміти, що там відбувається.
- Універсальність: чи підходить для інтеграції з іншими системами та мовами.
- Підтримка складних структур: вкладеності, колекцій, посилань, типів.
- Безпека та сумісність.
2. Бінарна серіалізація (Binary Serialization)
Бінарна серіалізація представляє дані у вигляді «сирого» двійкового потоку байтів. Уявіть, що ви не просто запакували речі в коробку, а ще й залили бетоном — швидко, компактно, але потім свої шкарпетки без відбійного молотка не знайдете.
// Приклад лише для історичної довідки:
using System.Runtime.Serialization.Formatters.Binary;
// ... створення об’єкта
var user = new User { Name = "Іван", Age = 42 };
// Серіалізація
using var fs = new FileStream("user.bin", FileMode.Create);
var formatter = new BinaryFormatter();
formatter.Serialize(fs, user);
Плюси:
- Компактність: мінімум місця на диску, висока швидкість.
- Вбудована підтримка «рідних» .NET-типів.
Мінуси:
- Формат взагалі нечитаємий — спробуйте відкрити файл у Блокноті, опинитеся в Матриці (тобто побачите набір нечитабельних символів).
- Абсолютно неуніверсальний: тільки для .NET (і то для тієї ж версії!).
- Вразливий до проблем сумісності між версіями.
Де застосовувався?
Усередині .NET, коли потрібно було швидко «дампнути» об’єкти між процесами на одній машині. Зараз категорично не рекомендується, особливо якщо ви дбаєте про безпеку й довгострокову підтримку застосунку. Використання BinaryFormatter у сучасних проєктах — погана практика.
3. Формат XML (Extensible Markup Language)
XML — людино- та машинозчитуваний формат, заснований на тегах, як-от HTML, але без смішних жартів про <body>.
<User>
<Name>Іван</Name>
<Age>42</Age>
</User>
Приклад серіалізації:
using System.Xml.Serialization;
var user = new User { Name = "Іван", Age = 42 };
var serializer = new XmlSerializer(typeof(User));
using var fs = new FileStream("user.xml", FileMode.Create);
serializer.Serialize(fs, user);
Плюси:
- Читабельність: можна відкрити й очима побачити структуру.
- Універсальність: XML уміють читати багато мов і програм.
- Гнучкість (підтримка схем, валідації, просторів імен тощо).
- Добре підходить для складних структур і вкладених об’єктів.
Мінуси:
- «Шумний» і важкуватий: займає багато місця й трафіку.
- Парсинг повільніший, ніж у бінарних форматів.
- Неточність під час серіалізації деяких типів (наприклад, дат і часу).
- Потребує додаткового налаштування для підтримки окремих колекцій чи нестандартних об’єктів.
Де застосовується?
Обмін даними між корпоративними системами, конфігурації, інтеграція з системами, де потрібна сувора структура.
4. Формат JSON (JavaScript Object Notation)
JSON — компактний, легкий і легко читабельний формат, який прийшов зі світу JavaScript і завоював майже весь світ у сфері обміну даними завдяки своїй лаконічності та простоті.
{
"Name": "Іван",
"Age": 42
}
Приклад серіалізації:
using System.Text.Json;
var user = new User { Name = "Іван", Age = 42 };
string json = JsonSerializer.Serialize(user);
File.WriteAllText("user.json", json);
Плюси:
- Дуже читабельний і для людини, і для машини.
- Легко інтегрується з вебтехнологіями (API, JavaScript тощо).
- Компактніший, ніж XML.
- Швидка серіалізація/десеріалізація в сучасних бібліотеках (System.Text.Json, Newtonsoft.Json).
Мінуси:
- Немає підтримки коментарів (ваш JSON не зможе пожартувати сам із себе).
- Обмеження щодо структур: не вміє серіалізувати, наприклад, посилання між об’єктами або складні типи даних (наприклад, словники з нерядковими ключами).
- Розбіжності у форматах дат і часу між різними реалізаціями.
Де застосовується?
Практично всюди, де потрібен обмін інформацією між різними платформами: вебсервіси, мобільні застосунки, REST API тощо.
5. CSV (Comma-Separated Values)
CSV — простий текстовий формат, що представляє дані у вигляді таблиці (рядки та стовпці), де поля розділяються комами або іншим роздільником.
Name,Age
Іван,42
Ольга,27
Приклад запису CSV вручну:
// Для простоти записуємо звичайним StreamWriter
var lines = new List<string>
{
"Name,Age",
"Іван,42",
"Ольга,27"
};
File.WriteAllLines("users.csv", lines);
Плюси:
- Підтримується величезною кількістю програм (Excel, Google Docs, БД тощо).
- Лаконічний і зручний для табличних даних.
Мінуси:
- Не підходить для вкладених або складних об’єктів (лише «пласкі» структури).
- Не зберігає інформацію про типи даних (усе — рядки).
- Проблеми з екрануванням, якщо у даних трапляються коми, лапки, перенесення рядків.
Де застосовується?
Експорт/імпорт даних між БД, обмін простими наборами записів, вивантаження із застосунків.
6. Протоколи й формати обміну з жорсткою типізацією
Protocol Buffers (protobuf) і MessagePack — формати бінарної серіалізації з контрактами (схемами), які роблять серіалізацію ще компактнішою й швидшою. Вони потребують заздалегідь описаної схеми структури даних.
Приклад на protobuf (спрощено):
Не входить до стандарту .NET, потрібен пакет Google.Protobuf.
message User {
string name = 1;
int32 age = 2;
}
Плюси:
- Максимальна швидкість і компактність.
- Кросплатформність (багато мов підтримують protobuf).
Мінуси:
- Складніший у вивченні та налаштуванні.
- Потребує генерації коду за схемою.
- Далеко не завжди потрібен, якщо проєкт — не про мільйони повідомлень за секунду.
Де застосовується?
Високонавантажені системи, обмін даними між мікросервісами, ігри, IoT.
7. Корисні нюанси
Таблиця-порівняння форматів
| Формат | Читабельність | Компактність | Універсальність | Складні об’єкти | Стандарт у .NET 9 | Безпека |
|---|---|---|---|---|---|---|
| Binary (.NET) | Ні | Так | Ні | Так | Ні | Ні |
| XML | Так | Ні | Так | Так | Так | Так |
| JSON | Так | Так | Так | Частково | Так | Так |
| CSV | Так | Так | Так | Ні | Ні | Так |
| Protobuf | Ні | Найкраща | Так | Так | Ні | Так |
Як обрати формат серіалізації для свого застосунку?
Зберігаєте складну структуру даних і вам важлива читабельність для людини — використовуйте XML або JSON.
Потрібно швидко передавати велику кількість даних між сервісами, які ви контролюєте — розгляньте protobuf або MessagePack.
Вивантажуєте звіти для аналізу в Excel або БД — використовуйте CSV.
Пишете конфігурацію для сервісів або CI/CD — YAML стане у пригоді.
Компактність, швидкість і підтримка посилань між об’єктами — критичні? Доведеться шукати бінарні формати, але пам’ятайте про мінуси безпеки та сумісності.
8. Хитрі моменти та часті помилки
Якщо ви вирішите зберігати дані в бінарному форматі заради «секретності», пам’ятайте: бінарний дамп не дорівнює безпеці. Зловмисник усе одно може «розібрати» цей потік. Використовуйте шифрування за потреби.
Поширена проблема: забути про кодування під час роботи з текстовими форматами (XML/JSON/CSV) — використовуйте UTF-8. Не всі редактори й системи люблять BOM.
XML, хоч і здається «старим», доречний для контрактних (договірних) протоколів, де важливий суворий валідаційний опис структури (наприклад, XSD-схеми), а JSON — для швидких, гнучких обмінів.
Під час серіалізації колекцій складних об’єктів не всі формати коректно підтримують вкладені або рекурсивні структури. JSON і XML дружать із масивами та списками, CSV — ні.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ