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