JSON 강의
유니티 게임개발캠프 TIL 31일차
직렬화(Serialization)
직렬화는 객체를 저장하거나 전송할 수 있는 형태로 변환하는 과정입니다. 이를 통해 객체의 상태를 파일, 데이터베이스 또는 메모리와 같은 영구 저장소에 저장하거나 네트워크를 통해 전송할 수 있습니다.
PlayerPrefs를 이용한 직렬화
Unity에서 PlayerPrefs는 간단한 데이터를 저장하는 데 사용됩니다. 문자열, 정수, 부동 소수점 숫자를 저장할 수 있습니다. 다음은 PlayerPrefs를 사용한 직렬화 예제입니다.
public class Player : MonoBehaviour
{
public string nickname;
public int lv;
public float hp;
void Start()
{
Serialize();
}
public void Serialize()
{
string saveData = nickname + ',' + lv + ',' + hp;
PlayerPrefs.SetString("PlayerData", saveData);
}
public void Deserialize()
{
string data = PlayerPrefs.GetString("PlayerData");
string[] datas = data.Split(',');
this.nickname = datas[0];
this.lv = int.Parse(datas[1]);
this.hp = float.Parse(datas[2]);
}
}
이 예제에서는 닉네임, 레벨, HP를 콤마로 구분하여 문자열로 저장하고, 이를 PlayerPrefs에 저장합니다. Deserialize 메서드를 통해 다시 객체로 복원할 수 있습니다.
CSV를 이용한 직렬화
CSV(Comma-Separated Values)는 텍스트 데이터를 저장하는 간단한 형식입니다.
각 줄이 하나의 레코드를 나타내며, 각 필드는 콤마로 구분됩니다.
void Start()
{
var csvData = Resources.Load<TextAsset>("CSVData");
Deserialize(csvData.text.TrimEnd());
}
void Deserialize(string data)
{
var rowData = data.Split('\n');
for (int i = 1; i < rowData.Length; i++)
{
var datas = rowData[i].Split(',');
// 데이터 처리 로직 추가
}
}
이 예제에서는 CSV 파일을 로드하여 각 줄을 파싱하고, 각 줄을 콤마로 분리하여 데이터를 처리합니다.
XML을 이용한 직렬화
XML(eXtensible Markup Language)은 데이터 저장과 전송을 위한 포맷입니다. XML은 데이터의 구조를 명확히 정의할 수 있어 복잡한 데이터 저장에 적합합니다. 아래 예제는 XML 직렬화와 역직렬화를 구현한 코드입니다.
using System.Xml.Serialization;
using System.IO;
[System.Serializable]
public class PlayerData
{
public string nickname;
public int lv;
public float hp;
}
public class Player : MonoBehaviour
{
public PlayerData playerData;
void Start()
{
playerData = new PlayerData { nickname = "Player1", lv = 10, hp = 100.0f };
Serialize();
Deserialize();
}
public void Serialize()
{
XmlSerializer serializer = new XmlSerializer(typeof(PlayerData));
StringWriter writer = new StringWriter();
serializer.Serialize(writer, playerData);
string xmlData = writer.ToString();
PlayerPrefs.SetString("PlayerData", xmlData);
}
public void Deserialize()
{
string xmlData = PlayerPrefs.GetString("PlayerData");
if (!string.IsNullOrEmpty(xmlData))
{
XmlSerializer serializer = new XmlSerializer(typeof(PlayerData));
StringReader reader = new StringReader(xmlData);
playerData = (PlayerData)serializer.Deserialize(reader);
}
}
}
- 직렬화:
- XmlSerializer를 사용하여 PlayerData 객체를 XML 문자열로 변환합니다.
- 변환된 XML 문자열을 PlayerPrefs에 저장합니다.
- 역직렬화:
- PlayerPrefs에서 저장된 XML 문자열을 불러옵니다.
- XmlSerializer와 StringReader를 사용하여 XML 문자열을 PlayerData 객체로 변환합니다.
예제 데이터
아래는 직렬화된 XML 데이터의 예시입니다.
<PlayerData>
<nickname>Player1</nickname>
<lv>10</lv>
<hp>100.0</hp>
</PlayerData>
이 XML 데이터는 PlayerData 객체의 상태를 나타내며, 이를 통해 객체의 상태를 쉽게 저장하고 복원할 수 있습니다.
JSON
JSON의 특징
- 가독성: 사람이 읽고 쓰기 쉽습니다.
- 경량: 데이터가 단순하고 구조화되어 있어 전송 속도가 빠릅니다.
- 언어 독립성: 대부분의 프로그래밍 언어에서 JSON을 쉽게 파싱하고 생성할 수 있습니다.
- 구조화된 데이터 표현: 객체와 배열을 사용하여 복잡한 데이터 구조를 표현할 수 있습니다.
JSON의 기본 구조
- 객체(Object): 중괄호 {}로 묶이며, 키-값 쌍의 집합입니다.
- 배열(Array): 대괄호 []로 묶이며, 값의 순서가 있는 리스트입니다.
예시:
{
"nickname": "Player1",
"lv": 10,
"hp": 100.0
}
Unity에서 JSON 직렬화
Unity에서는 JsonUtility 클래스를 사용하여 객체를 JSON으로 직렬화하고 역직렬화할 수 있습니다.
다음은 JSON을 사용한 직렬화와 역직렬화의 구체적인 예제입니다.
PlayerData 클래스 정의
먼저, 직렬화할 데이터 구조를 정의합니다.
[System.Serializable]
public class PlayerData
{
public string nickname;
public int lv;
public float hp;
}
JSON 직렬화 및 역직렬화 구현
다음으로, JsonUtility를 사용하여 직렬화 및 역직렬화를 구현합니다.
using UnityEngine;
public class Player : MonoBehaviour
{
public PlayerData playerData;
void Start()
{
playerData = new PlayerData { nickname = "Player1", lv = 10, hp = 100.0f };
Serialize();
Deserialize();
}
public void Serialize()
{
string jsonData = JsonUtility.ToJson(playerData);
PlayerPrefs.SetString("PlayerData", jsonData);
Debug.Log("Serialized JSON: " + jsonData);
}
public void Deserialize()
{
string jsonData = PlayerPrefs.GetString("PlayerData");
if (!string.IsNullOrEmpty(jsonData))
{
playerData = JsonUtility.FromJson<PlayerData>(jsonData);
Debug.Log("Deserialized Data: " + playerData.nickname + ", " + playerData.lv + ", " + playerData.hp);
}
}
}
이 예제에서는 PlayerData 객체를 JSON 형식으로 변환하여 PlayerPrefs에 저장하고, 다시 불러와 객체로 복원하는 과정을 보여줍니다.
- Serialize 메서드:
- JsonUtility.ToJson 메서드를 사용하여 PlayerData 객체를 JSON 문자열로 변환합니다.
- 변환된 JSON 문자열을 PlayerPrefs에 저장합니다.
- Debug.Log를 사용하여 직렬화된 JSON 문자열을 출력합니다.
- Deserialize 메서드:
- PlayerPrefs에서 저장된 JSON 문자열을 불러옵니다.
- JsonUtility.FromJson 메서드를 사용하여 JSON 문자열을 PlayerData 객체로 변환합니다.
- Debug.Log를 사용하여 역직렬화된 객체의 데이터를 출력합니다.
JSON을 사용하는 이유
JSON은 다양한 이유로 데이터 직렬화와 전송에 많이 사용됩니다:
- 경량성: JSON은 XML보다 훨씬 가볍고, 데이터 전송 속도가 빠릅니다.
- 호환성: 대부분의 프로그래밍 언어와 플랫폼에서 JSON을 지원합니다.
- 유연성: JSON은 객체와 배열을 사용하여 복잡한 데이터 구조를 쉽게 표현할 수 있습니다.
- 가독성: JSON은 사람이 읽고 이해하기 쉽습니다.
JSON은 특히 웹 개발에서 클라이언트와 서버 간의 데이터 교환 형식으로 많이 사용되며, RESTful API와 같은 웹 서비스에서 표준 데이터 형식으로 사용됩니다.