C#

[TIL] 직렬화 (Serialization)

unihee1 2025. 3. 11. 21:29

2025.03.07 - [Unity] - [TIL]Unity_ SerializeField와 Serializable에 대해 알아보자

 

[TIL]Unity_ SerializeField와 Serializable에 대해 알아보자

1. SerializeField와 Serializable의 개념- SerializeFieldprivate 또는 protected 변수도 유니티 인스펙터에서 보이게 해주는 속성(Attribute)이다.public 변수는 기본적으로 Unity에서 자동으로 직렬화 되지만 private 변

unihee1.tistory.com

이전 게시물에 짧게 다뤘던 직렬화에 대해 글을 써보려고 한다.

1. 직렬화(Serialization)란?

 

- 메모리 상의 정보를 나열하여 정리하는 과정.

- 실제로 사용되는 값을 추출하여 저장 가능한 형태로 변환.

- 데이터를 나열한 후 다시 원래대로 되돌릴 수 있음(역직렬화 가능)

 

2. PlayerPrefs

Unity에서 제공하는 간단한 데이터 저장 방식으로 주로 설정 값 (볼륨, 해상도, 최고 점수 등) 저장에 사용되며 내부적으로 레지스트리 (Windows) 또는 플랫파일 (모바일, Mac) 에 저장된다.

 

- 사용 방법

using UnityEngine;

public class PlayerPrefsExample : MonoBehaviour
{
    void Start()
    {
        // 데이터 저장
        PlayerPrefs.SetInt("HighScore", 100);
        PlayerPrefs.SetFloat("Volume", 0.8f);
        PlayerPrefs.SetString("PlayerName", "Spartan");
        PlayerPrefs.Save(); // 저장 확정

        // 데이터 불러오기
        int highScore = PlayerPrefs.GetInt("HighScore", 0); // 기본값 0
        float volume = PlayerPrefs.GetFloat("Volume", 1.0f);
        string playerName = PlayerPrefs.GetString("PlayerName", "DefaultName");

        Debug.Log($"HighScore: {highScore}, Volume: {volume}, PlayerName: {playerName}");
    }
}

 

- 장점 & 단점

장점 단점
사용법이 간단하다 파일 크기의 제한이 있다
게임 설정 같은 작은 데이터 저장에 적합하다 보안에 취약하다
플랫폼별로 알아서 저장된다 대량 데이터 저장이 불가능하다

3. CSV 

데이터를 쉼표로 구분하는 텍스트 기반 포맷으로 엑셀에서 열 수 있어서 설정 파일, 간단한 데이터 관리에 유용하다. 파일 크기가 작고 가볍지만 복잡한 데이터 구조 저장이 어렵다.

 

- 사용 방법 

using System;
using System.IO;

class CSVExample
{
    static void Main()
    {
        string filePath = "player.csv";

        // 데이터 저장 (CSV 직렬화)
        File.WriteAllText(filePath, "Name,Level,Score\nSpartan,5,1000");

        // 데이터 불러오기 (CSV 역직렬화)
        string[] lines = File.ReadAllLines(filePath);
        foreach (string line in lines)
        {
            Console.WriteLine(line);
        }
    }
}

 

- 장점 & 단점

장점 단점
사람이 쉽게 읽고 수정 가능하다 데이터 구조가 복잡하면 다루기 어렵다
엑셀과 연동 가능하다 JSON보다 속도가 느리다
간단한 데이터 저장용으로 적합하다 키-값 쌍 저장이 불가능하다 (배열이나 중첩 구조 표현 어려움)

4. XML 

<태그> 기반 데이터 포맷 설정 파일, 저장 데이터, 구성 파일 등에 사용되고 JSON보다 크기가 크지만 사람이 읽기 쉬운 포맷 Unity에서는 Localization(다국어 지원) 파일로 많이 사용된다.

 

- 사용 방법 

using System;
using System.IO;
using System.Xml.Serialization;

[Serializable]
public class Player
{
    public string Name;
    public int Level;
    public int Score;
}

class XMLExample
{
    static void Main()
    {
        Player player = new Player { Name = "Spartan", Level = 5, Score = 1000 };
        XmlSerializer serializer = new XmlSerializer(typeof(Player));

        // XML 저장 (직렬화)
        using (StreamWriter writer = new StreamWriter("player.xml"))
        {
            serializer.Serialize(writer, player);
        }

        // XML 불러오기 (역직렬화)
        using (StreamReader reader = new StreamReader("player.xml"))
        {
            Player loadedPlayer = (Player)serializer.Deserialize(reader);
            Console.WriteLine($"Name: {loadedPlayer.Name}, Level: {loadedPlayer.Level}, Score: {loadedPlayer.Score}");
        }
    }
}

 

- 장점 & 단점

장점 단점
사람이 읽기 쉬운 포맷이다 JSON보다 크기가 크다
설정 파일, 구성 데이터에 적합하다 속도가 느리다
다양한 시스템과 호환성 높다 복잡한 데이터 구조 표현이 어려울 수 있다

4. JSON

{ "key": "value" } 형태의 데이터 구조로 가볍고 가독성이 좋다.  XML보다 효율적이며 Unity에서는 JsonUtility 또는 Newtonsoft.Json을 사용하여 직렬화/역직렬화할 수 있다.

 

- 사용 방법

using UnityEngine;

[System.Serializable] // Json 직렬화를 위해 필요
public class Player
{
    public string Name;
    public int Level;
    public int Score;
}

public class JSONExample : MonoBehaviour
{
    void Start()
    {
        Player player = new Player { Name = "Spartan", Level = 5, Score = 1000 };

        // JSON 직렬화
        string json = JsonUtility.ToJson(player);
        Debug.Log(json); // {"Name":"Spartan","Level":5,"Score":1000}

        // JSON 역직렬화
        Player loadedPlayer = JsonUtility.FromJson<Player>(json);
        Debug.Log($"Name: {loadedPlayer.Name}, Level: {loadedPlayer.Level}, Score: {loadedPlayer.Score}");
    }
}

 

- 장점 & 단점

장점 단점
사람이 읽고 쓰기 쉽다 JSON 파일이 클 경우 속도 저하 가능성이 있다
XML보다 가볍다 XML보다 범용성이 낮을 수도 있다
다양한 언어 및 플랫폼에서 사용 가능하다 JsonUtility는 Dictionary 직렬화 불가능하 (Newtonsoft 사용 필요)