Unity/수업내용(C#)

[3.26] C# json 직렬화 & 역직렬화 복습 1

ljw4104 2021. 3. 26. 11:05

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Study13
{
    public class DataManager
    {
        private static DataManager instance;
        public GameInfo gameInfo;
        public Dictionary<int, CookieData> dicCookieDatas;

        private DataManager()
        {
            this.gameInfo = new GameInfo();
        }

        public static DataManager GetInstance()
        {
            if(instance == null)
            {
                instance = new DataManager();
            }
            return instance;
        }

        public bool LoadData(string json)
        {
            try
            {
                var arr = JsonConvert.DeserializeObject<CookieData[]>(json);
                this.dicCookieDatas = arr.ToDictionary(x => x.id);
            }catch(Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
            return true;
        }

        public bool LoadInfoData(bool isExist)
        {
            bool result = false;
            if (!isExist)
            {
                //신규유저
                //쿠키 데이터 딕셔너리에 저장된 값을 그대로 따라가며 저장 후 직렬화하면 됨.
                foreach(var item in dicCookieDatas)
                {
                    if (item.Value.isDefault)
                    {
                        this.gameInfo.cookieInfo.Add(new CookieInfo(item.Value.id, item.Value.isDefault));
                    } 
                }

                //★ 'GameInfo 객체'로 저장됨 ★ 배열로 저장되는게 아님!
                var json = JsonConvert.SerializeObject(gameInfo);
                System.IO.File.WriteAllText("./game_info.json", json);

                //직렬화 한 값을 다시 역직렬화 하는 과정 (저장한 값을 다시 사용하기 위해서)
                if(this.LoadInfoData(System.IO.File.Exists("./game_info.json")));
                    Console.WriteLine("[DataManager] 저장완료");
            }
            else
            {
                string path = "./game_info.json";
                string json = System.IO.File.ReadAllText(path);
                
                //★ 위에서 배열로 저장했으므로 직렬화할 때도 반드시 객체로 꺼내야 한다.
                var gameInfoData = JsonConvert.DeserializeObject<GameInfo>(json);

                this.gameInfo = gameInfoData;
                result = true;
            }

            return result;
        }
    }
}
using System;
using System.IO;
using System.Threading;

namespace Study13
{
    public class App
    {
        public App()
        {
            //Data로드 
            Console.WriteLine("***** 데이터를 로딩합니다. *****");
            string json = File.ReadAllText("./cookie_data.json");
            bool canLoadCookieData = DataManager.GetInstance().LoadData(json);
            while (!canLoadCookieData)
            {
                Console.WriteLine("[APP] 데이터를 다시 로딩합니다.");
                DataManager.GetInstance().LoadData(json);
                Thread.Sleep(1000);
            }
            Console.WriteLine("[APP] 쿠키 데이터 로딩성공\n");

            //신규 & 기본 판별하고 쿠키 데이터 로드
            DataManager.GetInstance().LoadInfoData(File.Exists("./game_info.json"));

            //게임준비 완료
            Console.WriteLine("\n\t***** 게임 준비완료 *****\n");
            Console.WriteLine(DataManager.GetInstance().gameInfo);
        }
    }
}

신규유저가 처음 접속 시 (좌) / 기존유저가 접속 시 (우)