내일배움캠프

Newtonsoft.Json을 사용한 게임 데이터 저장(내일배움캠프 10일차)

pracumj 2024. 9. 25. 23:54

오늘 공부한 내용 📝

오늘은 C#을 활용한 TEXT RPG 만들기 과제를 하면서 데이터 저장 방식에 대해 고민하던 중, Newtonsoft.Json을 알게 되어 사용해보았다. 이 라이브러리는 JSON 포맷으로 데이터를 쉽게 직렬화하고, 다시 객체로 역직렬화하는 데 매우 유용했다. JSON을 통해 데이터의 구조를 직관적으로 관리할 수 있었고, 게임 데이터를 저장하고 불러오는 기능을 간단하게 구현할 수 있었다.

 

JSON이란?

  • JSON(JavaScript Object Notation)은 데이터를 텍스트 형식으로 저장하고 교환하는 데 사용되는 경량 데이터 포맷
  •  Javascript의 문법을 따르지만, Javascript가 아니더라도 다수의 프로그래밍 언어에서 라이브러리를 제공
  • 키-값 쌍으로 데이터를 표현하며, 데이터를 직관적으로 구조화할 수 있어 사람이 읽기 쉽고, 기계가 파싱하기도 용이

예시 코드:

{
 
  "Job": "마법사",
  "Name": "스파르타",
  "Gold": 860,
  "Level": 2,
  "HP": 100,
}

 

Visual Studio에서 Newtonsoft.Json 사용하기

Visual Studio에서 Newtonsoft.Json을 사용하려면 NuGet 패키지를 설치해야 한다. 다음 단계를 따라 설치할 수 있다:

  1. 솔루션 탐색기에서 프로젝트를 우클릭하고, NuGet 패키지 관리를 선택
  2. 상단의 검색 창Newtonsoft.Json을 입력하고, 해당 패키지를 선택한 후 설치 버튼을 클릭

이 과정을 통해 프로젝트에 Newtonsoft.Json 라이브러리가 추가되며, 이를 사용해 JSON 데이터를 손쉽게 직렬화 및 역직렬화가 가능해진다.


직렬화(Serialization)를 통한 데이터 저장

직렬화는 객체(클래스 인스턴스) 데이터를 저장 가능한 형식으로 변환하는 과정이다. 예를 들어, 게임에서 플레이어 데이터를 파일로 저장하고 싶을 때, 이를 JSON 문자열로 변환하여 저장하는 것이 직렬화에 해당한다.

JsonConvert.SerializeObject() 메서드를 사용하여 객체를 JSON 포맷으로 직렬화할 수 있다.

예시 코드 :

//플레이어 클래스
public class Player
{
    public string Job { get; set; }
    public string Name { get; set; }
    public int Gold { get; set; }
    public int Level { get; set; }
    public int HP { get; set; }
}


//클래스 초기화
Player player = new Player(){Job = "마법사",Name ="스파르타",Gold = 1000, Level =1 , HP =100};
//Formatting.Indented를 사용해 들여쓰기와 줄바꿈이 적용
string jsonData = JsonConvert.SerializeObject(player, Formatting.Indented); 
File.WriteAllText("playerData.json", jsonData);

저장 결과:

{
  "Job": "마법사",
  "Name": "스파르타",
  "Gold": 1000,
  "Level": 1,
  "HP": 100
}

역직렬화(Deserialization)

역직렬화는 저장된 데이터를 다시 객체로 복원하는 과정이다. JSON 문자열로 저장된 데이터를 읽어들여 다시 C# 객체로 변환하는 것이 이에 해당한다. 역직렬화를 통해 저장된 플레이어 정보를 다시 불러와 게임에 사용이 가능하다

JsonConvert.DeserializeObject() 메서드를 사용하여 JSON 데이터를 객체로 변환할 수 있다.

string jsonData = File.ReadAllText("playerData.json");
Player loadedPlayer = JsonConvert.DeserializeObject<Player>(jsonData);

Private 필드 직렬화 / 역직렬화 

C#에서 private 필드는 기본적으로 직렬화/역직렬화가 되지 않는데,Newtonsoft.Json에서 제공하는  [JsonProperty]  속성을 사용하면 private 필드도 직렬화 및 역직렬화가 가능해진다!

  [JsonProperty]  private int Gold;


쉽게 설명하자면 직렬화는 클래스의 필드값을 json파일에 저장! , 역직렬화는 JSON 파일의 값을 읽어와 클래스의 필드 값으로 변환 하는 과정이라고도 볼 수 있을 것 같다.

 

마무리 😺

처음에는 파일을 직접 다뤄 데이터를 저장하는 방식에서 어려움을 많이 겪었지만, Newtonsoft.Json을 사용하니 훨씬 간결하게 데이터를 저장하고 불러올 수 있었다. 특히, 객체와 JSON 간의 변환이 매우 직관적이고 데이터의 구조도 한눈에 파악할 수 있었다. 앞으로 윈도우 콘솔 게임 개발에서 데이터 저장 및 로드 기능을 구현할 때, 매우 유용하게 활용할 수 있을 것 같다.