JavaRush /Курсы /C# SELF /Основные форматы сериализации:

Основные форматы сериализации: XML, JSON, CSV, Protobuf

C# SELF
43 уровень , 2 лекция
Открыта

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 — нет.

2
Задача
C# SELF, 43 уровень, 2 лекция
Недоступна
Сериализация объекта в формате JSON
Сериализация объекта в формате JSON
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ