카테고리 없음

JSON 강의

이황충 2024. 5. 30. 20:45

유니티 게임개발캠프 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);
        }
    }
}

 

  1. 직렬화:
    • XmlSerializer를 사용하여 PlayerData 객체를 XML 문자열로 변환합니다.
    • 변환된 XML 문자열을 PlayerPrefs에 저장합니다.
  2. 역직렬화:
    • PlayerPrefs에서 저장된 XML 문자열을 불러옵니다.
    • XmlSerializer와 StringReader를 사용하여 XML 문자열을 PlayerData 객체로 변환합니다.

예제 데이터

아래는 직렬화된 XML 데이터의 예시입니다.

<PlayerData>
    <nickname>Player1</nickname>
    <lv>10</lv>
    <hp>100.0</hp>
</PlayerData>

 

이 XML 데이터는 PlayerData 객체의 상태를 나타내며, 이를 통해 객체의 상태를 쉽게 저장하고 복원할 수 있습니다.


JSON

 

JSON의 특징

  1. 가독성: 사람이 읽고 쓰기 쉽습니다.
  2. 경량: 데이터가 단순하고 구조화되어 있어 전송 속도가 빠릅니다.
  3. 언어 독립성: 대부분의 프로그래밍 언어에서 JSON을 쉽게 파싱하고 생성할 수 있습니다.
  4. 구조화된 데이터 표현: 객체와 배열을 사용하여 복잡한 데이터 구조를 표현할 수 있습니다.

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에 저장하고, 다시 불러와 객체로 복원하는 과정을 보여줍니다.


  1. Serialize 메서드:
    • JsonUtility.ToJson 메서드를 사용하여 PlayerData 객체를 JSON 문자열로 변환합니다.
    • 변환된 JSON 문자열을 PlayerPrefs에 저장합니다.
    • Debug.Log를 사용하여 직렬화된 JSON 문자열을 출력합니다.
  2. Deserialize 메서드:
    • PlayerPrefs에서 저장된 JSON 문자열을 불러옵니다.
    • JsonUtility.FromJson 메서드를 사용하여 JSON 문자열을 PlayerData 객체로 변환합니다.
    • Debug.Log를 사용하여 역직렬화된 객체의 데이터를 출력합니다.

JSON을 사용하는 이유

JSON은 다양한 이유로 데이터 직렬화와 전송에 많이 사용됩니다:

  • 경량성: JSON은 XML보다 훨씬 가볍고, 데이터 전송 속도가 빠릅니다.
  • 호환성: 대부분의 프로그래밍 언어와 플랫폼에서 JSON을 지원합니다.
  • 유연성: JSON은 객체와 배열을 사용하여 복잡한 데이터 구조를 쉽게 표현할 수 있습니다.
  • 가독성: JSON은 사람이 읽고 이해하기 쉽습니다.

JSON은 특히 웹 개발에서 클라이언트와 서버 간의 데이터 교환 형식으로 많이 사용되며, RESTful API와 같은 웹 서비스에서 표준 데이터 형식으로 사용됩니다.