🐧 들어가기 앞서

지난 번에는 NewtonsSoft.Json을 이용해 직렬화, 역직렬화를 진행했다.

NewtonsSoft.Json
https://velog.io/@paenge1004/TIL-C-day-29

이번에는 따로 패키지 설치 없이, System.Text.Json 을 이용하자.


🐧 오늘 배운 것

  1. System.Text.Json

🐧 기억할 것 & 진행

JSON 직렬화 & 역직렬화 (게임 데이터 저장)

직렬화

  1. 우선 using 지시문을 작성한다.

  2. 구현

이전 포스팅을 보고 왔다면(NewtonsSoft.Json) 이해하기 쉬울 것이다.

public static void SaveGameData()
        {
            // 파일 이름 설정 _playerData.json
            string fileName = "_playerData.json";
            // 파일 저장 경로 설정
            string userDocumentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            // 파일 저장 경로 + 파일 이름 C:\Users\XXXX\Documents\_playerData.json) 
            string filePath = Path.Combine(userDocumentsFolder, fileName);
            // Json 형식 정렬
            var options = new JsonSerializerOptions { WriteIndented = true };
            // Json 직렬화
            string playersData = JsonSerializer.Serialize(MainProgram.player, options);
            // 유니코드 -> 한글 변환
            playersData = Regex.Unescape(playersData);
            // 파일 생성
            File.WriteAllText(filePath, playersData);
        }
  1. NewtonsSoft.Json과 다른점
  • System.Text.Json
string playersData = JsonSerializer.Serialize(MainProgram.player, options);
  • NewtonsSoft.Json
string _playerJson = JsonConvert.SerializeObject(_playerStat, Formatting.Indented);

직렬화 문법이 다르다.

  1. Json 형식 정렬
    이 메서드를 추가하지 않으면, Json 데이터가 모두 한 줄로 저장된다.
    가독성이 굉장히 떨어진다.
var options = new JsonSerializerOptions { WriteIndented = true };
  1. 유니코드 -> 한글 변환
    Json에 한글 데이터를 저장하면, 이스케이프 문자열로 출력됐다.
    예를 들어,
안녕하세요
->
\uC548\uB155\uD558\uC138\uD558

따라서, 이스케이프 문자열을 원래의 형태로 바꿔주기 위해 아래 함수를 추가했다.

 playersData = Regex.Unescape(playersData);

역직렬화

public static void LoadGameData()
        {
            string fimeName = "_playerData.json";
            string userDocumentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            string filePath = Path.Combine(userDocumentsFolder, fimeName);
            if(File.Exists(filePath))
            {
                string playerJson = File.ReadAllText(filePath);
                playerJson = Regex.Unescape(playerJson);
                Character loadedCharacter = JsonSerializer.Deserialize<Character>(playerJson);
                MainProgram.player = loadedCharacter;
            }
            else
            {
                // 추후 게임 데이터 설정화면 생기면 이동.
                Console.WriteLine("데이터가 없습니다.");
                Thread.Sleep(500);
                MainProgram.GameDataSetting();
            }
        }

🐧 게임에 구현한다면?

데이터 없을 경우

  • 데이터가 없음을 알린 뒤, 게임 데이터 세팅 메서드를 호출해 메인 화면으로 넘어간다.

데이터 있을 경우

  • 메인 화면을 바로 실행한다.

  • 휴식을 진행하면, 체력과 마나를 50씩 올려준다.

  • 휴식이 진행되는 모습이다.(사진의 숫자는 관계없음!)

  • 플레이어의 문서 폴더에 json파일이 성공적으로 저장된 모습이다.

0개의 댓글