C#/수업 내용
2023.01.13 오전 수업 내용 : 직렬화
Bueong_E
2023. 1. 13. 15:09
반응형
SMALL
직렬화 복습
Item class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Study12
{
//[Serializable] Newtosoft.Json에서는 불필요함
class Item
{
//맴버 변수
//직렬화 할 객체의 필드 한정자는 public 이어야 한다.
public int damage;
public string name;
//생성자
public Item()
{
}
}
}
App Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
//객체(상태) -> 문자열
//객체 생성
Item item = new Item();
item.name = "홍길동";
item.damage = 100;
//직렬화, namespece 에 newton추가
string json = JsonConvert.SerializeObject(item);
//직렬화된 문자열 출력
WriteLine(json);
//직렬화된 문자열을 파일(.jason)에 저장
File.WriteAllText("./my_item.json", json);
//저장된 파일 내용 확인
//.dll .xml 두 파일도 실행파일이므로 지우면 안됨 시험볼때도 해당 파일들은 그대로 있어야함
//.exe 실행파일과 동일한 위치에 NewtonsoftJson 이 있어야 한다.
}
}
}
역직렬화 복습
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
//역직렬화
//문자열 -> 객체
//저장된 파일(.json) 불러오기
string json = File.ReadAllText("my_item.json");
//파일의 내용(json형식의 문자열) 출력 하기 (문자열이 어떤 형식과 매칭하는지)
Console.WriteLine(json);
//다른말로는 뭘 저장했는지 알아야 해당 형식으로 역직렬화가 가능하다.
//아이템 형식의 객체를 저장하였으니 아이템 형식으로 역직렬화
//우리는 배열 혹은 단일객체만 역직렬화 할거기때문에 두가지중 하나만 확인하면 된다.
Item item = JsonConvert.DeserializeObject<Item>(json);
//객체 상태 출력하기
WriteLine("{0},{1}", item.name, item.damage);
}
}
}
파일 지우기
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
string path = "./my_item.json";
// 파일 지우기
if (File.Exists(path))
{
File.Delete(path);
WriteLine("{0}을 지웠습니다.", path);
}
else
WriteLine("{0}이 없습니다.",path);
}
}
}
객체 배열 직렬화
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
List<Item> items = new List<Item>();
items.Add(new Item() { damage = 10, name = "장검"}); ;
items.Add(new Item() { damage = 1, name = "단검"}); ;
items.Add(new Item() { damage = 14, name = "창"}); ;
items.Add(new Item() { damage = 16, name = "방패"}); ;
items.Add(new Item() { damage = 199, name = "장검"}); ;
//직렬화
//객체(Item들을 저장하고있는 List인스턴스) ->json으로 저장
string json = JsonConvert.SerializeObject(items);
File.WriteAllText("items.json", json);
}
}
}
객체 배열 역직렬화
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
//역직렬화
//JSON문자열 을 객체로 변환
//우리가 저장한 JSON문자열은 리스트(배열)이므로 배열형태로 역직렬화 되어야 함
//파일 읽기
string json = File.ReadAllText("items.json");
//json 문자열 출력
List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json);
Console.WriteLine(items.Count);
foreach(var item in items)
{
Console.WriteLine("{0},{1}",item.name,item.damage);
}
//JSON 문자열은 키/캆 저장이므로
//키/값을 저장하는 컨테이너(컬렉션) Dictionary에 저장가능
//키는 중복되면 안된다.
}
}
}
게임 변하지 않는 데이터 설명
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
//게임에서 변하는 데이터
//사용자에 의해 변하는 데이터(경험치,레벨,획득아이템, 강화 된 아이템 등등등)
//사용자의 정보(저장해야할 데이터)
//그동안 우리는 이 변하지 않는 데이터 위주로 작성했다.
//100ID 공격력 10
//강화 되어 공격력 11증가 했다면 변하는 데이터이다.
//그말은 장검의 공격력만 저장할수 있다는 말이다.
//id가 100인 아이템 획득
//강화 공격력11
//100 ID 공격력 11
//변하지 않는 데이터
//게임이 시작될떄 구성요소들을 초기화하는 용도로 사용하는 데이터
//(캐릭터를 생성할때 default 값 등)
//게임에 포함되어있는 데이터 파일(JSON)
//100 ID = 장검이라고 생각해보자 ,공격력 10 , 멋지고 강해보이는 장검(설명)
}
}
}
변화하지 않는 데이터 (프로세스가 있으니 외워라)
맵핑 클래스 제작
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Study12
{
//맵핑 클래스 바인딩 클래스(데이터 테이블의 row와 맵핑)
class ItemData
{
//저장할일이 없는 클래스이다.
//변하지 않는 데이터는 저장할일이 없다.
//역직렬화 할때 타입으로 사용된다.
//맴버 변수들은 엑셀의 컬럼들으로 정의한다.
//한정자는 반드시 퍼블릭 이어야 한다.
//생성자는 만들필요 없다 ==== 중요!!!!!
//Json 컨버트 할때 알아서 객체를 생성해 주기 떄문에 생성자 노필요
//데이터테이블의컬럼 순서를 지킨다
//컬럼명과 타입은 반드시 동일하게 한다.
public int id;
public string name;
public int damage;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
string json = File.ReadAllText("./item_data.json"); //데이터 테이블
WriteLine(json);
//역직렬화대상은 클래스 이름뒤에 반드시 Data라고 명시 할 것임 ItemData = 변하지 않는 데이터
//아이템 데이터 객체에 역직렬화
//데이터를 불러와서 메모리에 적재하는 과정이 로딩이다.
ItemData[] itemData = JsonConvert.DeserializeObject<ItemData[]>(json);
foreach(var item in itemData)
{
WriteLine("{0},{1},{2}", item.id, item.name, item.damage);
}
//만약에 특정 id에 해당하는 ItemData를 찾으려면 반복문을 사용해서 순회해야 한다.
ItemData foundData = null;
int serchId = 102;
foreach (ItemData data in itemData)
{
if (serchId == data.id)
{
foundData = data;
break;
}
else if (foundData != null)
{
WriteLine("아이템 데이터를 찾았습니다");
WriteLine("{0}{1}{2}", foundData.id, foundData.name, foundData.damage);
}
else
Console.WriteLine("id{0}을 못찾았습니다.", data.id);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
string json = File.ReadAllText("./item_data.json"); //데이터 테이블
WriteLine(json);
//역직렬화대상은 클래스 이름뒤에 반드시 Data라고 명시 할 것임 ItemData = 변하지 않는 데이터
//아이템 데이터 객체에 역직렬화
//데이터를 불러와서 메모리에 적재하는 과정이 로딩이다.
ItemData[] itemData = JsonConvert.DeserializeObject<ItemData[]>(json);
//Dictionary를 사용하면 키로 즉시 요소를 찾을수 있다.
//배열에 있는 모든 요소를 Dictionary를 넣어줘야함
//컬렉션은 사용전에 반드시 인스턴스화 해야한다.
Dictionary<int, ItemData> dicItemDatas = new Dictionary<int, ItemData>();
//옮겨 담기
foreach (ItemData data in itemData) // Dictionary애 옮겨 담는다.
{
dicItemDatas.Add(data.id, data);
}
//사전에 있는 모든 요소 출력
foreach(KeyValuePair<int,ItemData> pair in dicItemDatas)
{
int id = pair.Key;
ItemData data = pair.Value;
WriteLine("{0},{1}", id, data.name, data.damage);
}
int serchItemId = 102;
ItemData foundItemData = dicItemDatas[serchItemId];
WriteLine("{0}{1}{2}", foundItemData.id,foundItemData.name, foundItemData.damage);
//중요한건 배열의 요소를 Dictionary에 옮겨 담아라
}
}
}
LINQ 사용
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console; //Staic을 넣어줘야 Console 사용이 가능하더라
using Newtonsoft.Json;
using System.IO;
namespace Study12
{
class App
{
//생성자
public App()
{
WriteLine("App");
string json = File.ReadAllText("./item_data.json"); //데이터 테이블
//역직렬화대상은 클래스 이름뒤에 반드시 Data라고 명시 할 것임 ItemData = 변하지 않는 데이터
//아이템 데이터 객체에 역직렬화
//데이터를 불러와서 메모리에 적재하는 과정이 로딩이다.
//Dictionary를 사용하면 키로 즉시 요소를 찾을수 있다.
//배열에 있는 모든 요소를 Dictionary를 넣어줘야함
//컬렉션은 사용전에 반드시 인스턴스화 해야한다.
var dic =
JsonConvert.DeserializeObject<ItemData[]>(json).ToDictionary(x => x.id);
//옮겨 담기
var data = dic[102];
WriteLine(data.name);
}
}
}
json -> 객체 역직렬화 실습
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
namespace Study013
{
class App
{
public App()
{
//Json 데이터 불러오기
string json = File.ReadAllText("./item_data.json");
//foreach를 사용하여 Dictionary 컬렉션에 할당 하는 방법
//ItemData[] itemDatas = JsonConvert.DeserializeObject<ItemData[]>(json);
//Dictionary<int, ItemData> itemLists = new Dictionary<int, ItemData>();
//foreach (var itemdata in itemDatas)
//{
// itemLists.Add(itemdata.id, itemdata);
// Console.WriteLine(itemdata);
//}
// LINQ 사용하여 Dictionary 컬렉션에 할당 하는 방법
var itemLists = JsonConvert.DeserializeObject<ItemData[]>(json).ToDictionary(x => x.id);
//내용물 출력
foreach (var itemList in itemLists)
{
int id = itemList.Key;
ItemData data = itemList.Value;
Console.WriteLine("{0},{1},{2}", id, data.name, data.damage);
}
}
}
}
내가 실습한 2개의 데이터 테이블을 이용한 미션 목록 및 보상작성
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
namespace Study013
{
class App
{
public App()
{
string missionJson = File.ReadAllText("./mission_data.json");
string itemJson = File.ReadAllText("./item_data.json");
var missionLists = JsonConvert.DeserializeObject<MissionData[]>(missionJson).ToDictionary(x => x.id);
var itemLists = JsonConvert.DeserializeObject<ItemData[]>(itemJson).ToDictionary(x => x.id);
foreach (var missionList in missionLists)
{
foreach (var itemList in itemLists)
{
if(itemList.Value.id == missionList.Value.resultItem)
{
Console.WriteLine("미션 : {0}", missionList.Value.mossion);
Console.WriteLine("미션 내용 : {0}", missionList.Value.missionStory);
Console.WriteLine("미션 목표 : {0}", missionList.Value.objective);
Console.WriteLine("미션 보상 : {0}X{1}\n", itemList.Value.name, missionList.Value.itemNum);
}
}
}
}
}
}
결과창
반응형
LIST