오늘의 학습 키워드

JsonSerializer.Serialize

공부한 내용

목표 : 세이브와 로드

시도한 것 : 저장할 때 JsonSerializer.Serialize(클래스)로 불러오려고 했다.

문제 : JsonSerializer.Serialize는 클래스로 불러오면 클래스 안의 구조체까지는 접근하지 못한다. 또한 프로퍼티 값이어야 읽어올 수 있다.

해결 : 사용할 때 JsonSerializer.Serialize(클래스명.클래스구조체)로 세이브 했다.

public struct CharacterInfo
{
    public int Level { get; set; }
    public string Name { get; set; }
    public float Attack { get; set; }
    public float Defense { get; set; }
    public float Health { get; set; }
    public float Gold { get; set; }
    public bool IsDead { get; set; }
    public float MaxHealth { get; set; }
    public float DefaultAttack { get; set; }
    public float DefaultDefense { get; set; }
}
class JsonUtility
    {
        public static void Save<T>(T t)
        {
            string json = JsonSerializer.Serialize(t);
            File.WriteAllText(@"D:\data.json", json);
        }

        public static T Load<T>(string path)
        {
            var json = File.ReadAllText(path);
            if (json != null)
            {
                return JsonSerializer.Deserialize<T>(json);
            }
            else
            {
                return default(T);
            }
        }
    }
static void Main(string[] args)
{
    Console.ForegroundColor = ConsoleColor.Green;

    Game game = new Game();

    // TODO : 추후 캐릭터 선택창 만들 것
    // 시작 : 캐릭터를 선택하시오
    // 끝 : 캐릭터 인스턴스 생성
    character = new Warrior();

    var info = JsonUtility.Load<Character.CharacterInfo>(@"D:\data.json");
    if (info.Name != null)
    {
        character.Info = info;
    }

    while (true)
    {
        game.Start();
    }
}

개인 과제 질문 피드백

기능 구상이 어려울 때

- 처음 기능이 끝까지 갈 수가 없음
    - 나중에 바뀌기 마련
    - 개방 폐쇄 원칙(Open Close) : 확장에는 개방 수정에는 폐쇄
- 플로우 차트 만들어보기 (와이어 프레임)

 

변수 정하기

- 왼쪽과 오른쪽은 기획에서 달라질 수 있는 부분이다.

- 왼쪽이 필요한 경우라면 공격력이 필요한 방어구(가시방패)가 필요 한다던지 하는 경우

- 오른쪽은 그런 것이 필요하지 않을 때

가장 중요한 것은 왜 이 방식을 선택했는지에 대한 근거가 필요하다.

클래스를 어떻게 나누는가?

- 외부로 둔다면 영향을 줄 수 있는 범위가 커진다.
- 최대한 분리한다면 영향을 적게 준다. 하지만 접근하는데 불편할 수 있다.

- 이것도 상황 판단 하에 정하기 -> 장단점을 파악하면서 사용

 

추가 : if else와 try catch문 어떨 때 쓰는 게 좋은가

- 입력을 받았을 때 입력이 예상 가능하면 if문
- 입력이 예상 불가능 하면 try catch문

오늘의 회고

 오늘은 TextRPG 구현을 마무리하고 제출하는 날이었다. 시간이 촉박했기에 부랴부랴 만드느라 코드에 대한 고민이 조금 부족했던 것 같다. 다른 사람의 코드도 보면서 좋은 방법들이 있다면 질문해보고 내 것에 적용하는 시간(리팩토링)을 가져야겠다. 팀 프로젝트도 TextRPG의 연장선으로 진행한다고 하는데 좋은 방법들을 많이 적용하도록 하고 글로 또 남겨서 헷갈릴 때마다 다시 보고 해야겠다.

 내일은 이전에 언급했다싶이 리팩토링을 진행할 생각이다. 또한 깃허브에 ReadMe파일에 정리하는 시간을 가지도록 해야겠다. 내일도 파이팅!

 

 

깃허브 링크 :

https://github.com/JeongJuChan/TextRPG_Single

 

GitHub - JeongJuChan/TextRPG_Single

Contribute to JeongJuChan/TextRPG_Single development by creating an account on GitHub.

github.com

 

 

참고 :

https://www.csharpstudy.com/Data/Json-SystemTextJson.aspx

 

System.Text.Json - C# 프로그래밍 배우기 (Learn C# Programming)

System.Text.Json .NET Core 3.0에서 새로운 Json 지원 클래스로서 System.Text.Json가 내장(built-in) 되었으며, ASP.NET Core 3.0 에서 디폴트 Json Serializer가 서드파티의 Newtonsoft.Json에서 System.Text.Json 으로 변경되었다

www.csharpstudy.com

 

 

+ Recent posts