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