← Назад к вопросам

Что такое сериализация?

1.3 Junior🔥 211 комментариев
#C# и ООП#Unity Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое сериализация?

Сериализация — это процесс преобразования структуры данных или состояния объекта в формат, который может быть сохранен (например, в файл) или передан (например, через сеть), и затем восстановлен (десериализован) в исходную или аналогичную структуру. В контексте разработки игр на Unity, сериализация является фундаментальным механизмом для сохранения прогресса игры, передачи данных между клиентом и сервером, конфигурации игровых объектов и работы с редактором Unity.

Основные цели и применение в Unity

  • Сохранение игры (Save/Load Systems): Преобразование данных игрока, состояния мира, инвентаря в формат файла (JSON, XML или бинарный) для последующего загрузки.
  • Конфигурация через Inspector: Поля public или с атрибутом [SerializeField] в скриптах автоматически сериализуются Unity и отображаются в редакторе.
  • Сетевая коммуникация (Networking): При использовании Unity Netcode или других решений данные объектов сериализуются для передачи по сети другим клиентам.
  • Работа с Asset Pipeline: Преобразование данных ресурсов (моделей, текстур) в внутренний формат Unity для эффективной работы в runtime.

Типы сериализации в Unity

В Unity преимущественно используются два типа:

  1. Сериализация в редактор (Editor Serialization): Для сохранения значений компонентов в префабах, сценах и материалах. Unity использует свой собственный бинарный формат YAML (например, для файлов .prefab или .asset). Поля сериализуются автоматически, если они public, либо имеют атрибут [SerializeField] для private полей.

    public class PlayerData : MonoBehaviour
    {
        // Поле будет сериализовано и показано в Inspector
        public int health = 100;
    
        // Private поле также будет сериализовано благодаря атрибуту
        [SerializeField]
        private string playerName;
    }
    
  2. Runtime-сериализация для сохранения данных: Для систем сохранения игры разработчики чаще используют текстовые форматы, такие как JSON (через JsonUtility или сторонние библиотеки) или XML, из-за их читаемости и простоты.

    using UnityEngine;
    using System.IO;
    
    public class SaveSystem
    {
        public void SaveGame(PlayerData data)
        {
            // Сериализация объекта в JSON строку
            string jsonData = JsonUtility.ToJson(data, true);
            // Запись строки в файл
            File.WriteAllText(Application.persistentDataPath + "/save.json", jsonData);
        }
    
        public PlayerData LoadGame()
        {
            string path = Application.persistentDataPath + "/save.json";
            if (File.Exists(path))
            {
                string jsonData = File.ReadAllText(path);
                // Десериализация JSON строки в объект
                return JsonUtility.FromJson<PlayerData>(jsonData);
            }
            return null;
        }
    }
    

Ключевые классы и атрибуты Unity для сериализации

  • JsonUtility: Упрощенный API Unity для работы с JSON. Поддерживает сериализацию классов, но имеет ограничения (например, не сериализует Dictionary).
  • [SerializeField]: Атрибут, позволяющий сериализовать private или protected поля в редакторе.
  • [NonSerialized] или System.NonSerialized: Атрибут, который предотвращает сериализацию поля в редакторе (для public полей) или при использовании JsonUtility.
  • ISerializationCallbackReceiver: Интерфейс для классов, которым требуется выполнить дополнительные действия перед сериализацией или после десериализации (например, для сложных структур данных).

Практические рекомендации

  • Для сложных систем сохранения с глубокими структурами данных часто используют сторонние библиотеки, такие как Newtonsoft.Json, из-за их большей гибкости.
  • При работе с префабами и ScriptableObjects важно понимать, что их изменения сериализуются в файлы проекта, поэтому необходимо соблюдать осторожность при обновлении данных в runtime, чтобы избежать повреждения ресурсов.
  • Для оптимизации сетевой передачи данных используют бинарную сериализацию, которая менее объемна, но требует более сложной реализации.

Таким образом, сериализация в Unity — это не просто технический процесс, а центральный механизм, связывающий редактор, runtime-логику и данные игры, обеспечивая персистентность, конфигурируемость и коммуникацию между различными частями игровой системы. Грамотное использование ее инструментов напрямую влияет на архитектуру, производительность и удобство разработки проекта.

Что такое сериализация? | PrepBro