C#/수업 내용
Item 저장, 직렬화/역직렬화
Game Client Lee Hwanguk
2023. 1. 13. 14:28
https://cafe.naver.com/gameprogramming25?iframe_url=/MyCafeIntro.nhn%3Fclubid=30883321
App
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; //직렬화를 위한 namespace추가
using System.IO; //저장을 위한 namespace추가
namespace Study15
{
internal class App
{
public App()
{
//파일 읽기
string json=File.ReadAllText("./item_data.json"); //데이터 테이블
//역직렬화대상은 클래스이름뒤에 반드시 Data라고 명시할것임 ItemData
//아이템 데이터 객체에 역직렬화
ItemData[]itemDatas=JsonConvert.DeserializeObject<ItemData[]>(json);
//출력
foreach(ItemData data in itemDatas)
{
Console.WriteLine("{0},{1},{2}",data.id,data.name,data.damage);
}
//만약 특정 id에 해당하는 ItemData를 찾으려면? 반복문을 사용해서 순회해야한다
ItemData foundData = null; //그냥 프로세서를 외워버리자
int searchId = 102;
foreach (ItemData data in itemDatas)
{
if (searchId == data.id)
{
foundData = data;
break;
}
}
if(foundData!= null)
{
Console.WriteLine("아이템을 찾았습니다.");
Console.WriteLine("{0}{1}{2}",foundData.id,foundData.name,foundData.damage);
}
else
{
Console.WriteLine("id{0} 데이터를 찾지 못했습니다.",searchId);
}
}
}
}
Item
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Study15
{
//[Seriallizable] //Newtonsoft.Json에서는 불필요
internal class Item
{
//맴버변수
public int damage; //반드시 한정자가 public이여야 직렬화 가능
public string name;
//생성자
public Item(string name, int damage)
{
this.name = name;
this.damage = damage;
}
}
}
ItemData
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Study15
{
//맵핑 클래스, 바인딩 클래스 (데이터 테이블의 row와 맴핑)
internal class ItemData
{
//변하지 않는 데이터는 저장할 일이 없다
//역직렬화 할때 타입으로 사용됨
//맴버 변수들은 엑셀의 컬럼들로정의한다
//한정자는 반드시 public이여야한다
//생성자는 만들필요없다
//필드만 정의하면 된다
//데이터테이블의 컬럼 순서를 지킨다
//컬럼명과 타입을 반드시 동일하게 한다
public int id;
public string name;
public int damage;
}
}
#연습1 쿠키런 아이템이름,가격 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cookierun
{
//생성자 만들 필요x
//역직렬화 할때 타입으로 사용된다
//맴버 변수들은 엑셀의 컬럼들으로 정의한다
//한정자는 반드시 public 이여야 한다
//필드만 정의하면 된다
//데이터테이블의 컬럼순서를 지킨다
//컬럼명과 타입을 반드시 동일하게 한다
internal class ItemData
{
public string name;
public int price;
}
}
#1.foreach
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; //File.ReadAllText를 쓰기위해
using Newtonsoft.Json; //Json 메서드를 쓰기위해
namespace Cookierun
{
internal class App
{
public App()
{
//파일 읽기
string json=File.ReadAllText("./item_data.json");
//아이템 데이터 객체에 역직렬화
ItemData[] itemDatas = JsonConvert.DeserializeObject<ItemData[]>(json);
foreach(ItemData data in itemDatas)
{
Console.WriteLine("{0},{1}",data.name,data.price);
}
Console.WriteLine();
}
}
}
# 아이템의 name과 price 전체 출력
#만약 "링쿠키 울타리"를 찾는다면 name과 price를 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; //File.ReadAllText를 쓰기위해
using Newtonsoft.Json; //Json 메서드를 쓰기위해
namespace Cookierun
{
internal class App
{
public App()
{
//파일 읽기
string json=File.ReadAllText("./item_data.json");
//아이템 데이터 객체에 역직렬화
ItemData[] itemDatas = JsonConvert.DeserializeObject<ItemData[]>(json);
foreach(ItemData data in itemDatas)
{
Console.WriteLine("{0},{1}원",data.name,data.price);
Console.WriteLine();
}
//만약에 특정 name에 해당하는 ItemData(name+price)를 찾을라면 반복문을 사용해서 순회 해야 한다
ItemData foundData= null;
string searchName = "링쿠키 울타리"; //링쿠키 를 검색하면 링쿠키 울타리 + 가격으로 출력
foreach(ItemData data in itemDatas)
{
if(data.name==searchName)
{
foundData = data;
break;
}
}
if(foundData!=null)
{
Console.WriteLine("{0}을 찾았습니다. {0},{1}원",foundData.name,foundData.price);
}
else
{
Console.WriteLine("{0}을 찾지 못했습니다",searchName);
}
}
}
}