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);
}
}
}