[TIL] 직렬화 (Serialization)
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 사용 필요) |