직렬화?
- 개체(Object)를 저장하거나, 메모리(Memory), 데이터베이스(Database) 또는 파일(File)로 전송하기 위해 개체를 바이트 스트림으로 변환하는 프로세스.
- 쉽게 말해 객체를 텍스트 형식으로 변환해 저장해 전송할 수 있도록 만드는 과정이다.
- XML, JSON 등을 통해 직렬화 할 수 있다.
- 반대로 역직렬화(deserialization)는 직렬화된 데이터를 다시 원래 객체로 변환하는 것. 저장한 데이터(텍스트)를 다시 불러오기 위해 사용한다.
사용하는 이유
데이터 저장 : 게임 데이터를 파일로 저장하고 불러옴
네트워크 전송 : 서버와 클라이언트 간 객체 데이터를 주고받음
객체 복제 : 객체를 메모리 내에서 복사
설정 저장 : JSON, XML 형식으로 설정 파일을 저장하고 로드
PlayerPrefs
- PlayerPrefs는 직렬화 방식이 아닌 간단한 데이터(Key Value) 저장 방식이지만, 이해를 돕기 위해 함께 설명.
- 문자열, 정수, 실수만 저장이 가능하고 데이터는 운영체제의 레지스트리나 특정 파일에 저장된다.
using UnityEngine;
public class PlayerPrefsExample : MonoBehaviour
{
void Start()
{
PlayerPrefs.SetInt("HighScore", 100);
PlayerPrefs.Save();
int highScore = PlayerPrefs.GetInt("HighScore", 0);
Debug.Log("최고 점수: " + highScore);
}
}
- 게임 내 최고 점수를 저장하고 불러오는 등의 간단한 데이터를 저장할 수 있다. (설정값, 점수 등)
- 하지만 객체는 저장이 불가능. JSON처럼 복잡한 데이터 구조는 저장이 불가능하다.
JSON 직렬화
using UnityEngine;
[System.Serializable]
public class PlayerData
{
public string name;
public int level;
public float health;
}
public class Test : MonoBehaviour
{
void Start()
{
PlayerData player = new PlayerData { name = "Gee", level = 5, health = 75.5f };
string json = JsonUtility.ToJson(player);
Debug.Log("저장된 JSON: " + json);
PlayerData loadedPlayer = JsonUtility.FromJson<PlayerData>(json);
Debug.Log($"이름: {loadedPlayer.name}, 레벨: {loadedPlayer.level}, 체력: {loadedPlayer.health}");
}
}
- JSON 직렬화는 객체를 문자열(JSON 포맷)로 변환하여 파일로 저장하는 방식.
- 유니티에서는 해당
JsonUtility 방식을 가장 많이 사용함. 가볍고 빠르며 네트워크 전송이나 파일 저장에 적합하다.
- 플레이어의 상태나 인벤토리 등 복잡한 객체의 구조를 저장할 수 있고, 파일로 저장하여 관리하기 때문에 PlayerPrefs보다 데이터 양이 많아도 안정적이다.
세이브 파일을 JSON으로 저장하기
using System.IO;
using UnityEngine;
public class SaveManager : MonoBehaviour
{
[System.Serializable]
public class PlayerData
{
public string playerName;
public int level;
public float health;
}
private string savePath;
void Start()
{
savePath = Path.Combine(Application.persistentDataPath, "savefile.json");
Debug.Log("저장 경로: " + savePath);
}
public void SaveGame()
{
PlayerData data = new PlayerData { playerName = "Hero", level = 10, health = 100.0f };
string json = JsonUtility.ToJson(data);
File.WriteAllText(savePath, json);
Debug.Log("게임 저장 완료");
}
public void LoadGame()
{
if (File.Exists(savePath))
{
string json = File.ReadAllText(savePath);
PlayerData data = JsonUtility.FromJson<PlayerData>(json);
Debug.Log($"불러온 데이터 - 이름: {data.playerName}, 레벨: {data.level}, 체력: {data.health}");
}
else
{
Debug.Log("저장된 데이터가 없습니다.");
}
}
}
- 이처럼 객체를 JSON으로 변환해 파일로 저장이 가능함
- 플레이어 정보나 아이템 등의 게임 세이브 데이터 관리에 적합하다.
PlayerPrefs vs JSON
| 비교 항목 | PlayerPrefs | JSON 직렬화 |
|---|
| 저장 방식 | 운영체제의 레지스트리 / 내부 저장소 | 파일(JSON)로 저장 |
| 저장 데이터 유형 | int, float, string (단순한 값) | 객체(클래스, 리스트, 배열 등) |
| 사용 용도 | 설정 값, 최고 점수 저장 게임 저장 | 데이터, 인벤토리 등 |
| 파일 위치 | OS별 특정 저장 위치 | Application.persistentDataPath에 파일 생성 |
| 데이터 크기 | 작음 (몇 개의 변수) | 큼 (복잡한 데이터 가능) |
| 장점 | 매우 간단, 코드 짧음 | 복잡한 데이터 구조 저장 가능 |
| 단점 | 객체 저장 불가, 보안 취약 | 파일 입출력 필요 |
- PlayerPrefs는 최고 점수, 게임 설정 값, 컨트롤 설정 등 작은 데이터 저장에 적합
- JSON 직렬화는 플레이어의 상태, 인벤토리, 퀘스트 진행도 등 보다 복잡하고 많은 양의 데이터 저장에 적합
- 간단한 값 저장 = PlayerPrefs
- 객체 저장 & 데이터 파일 생성 = JSON 직렬화