C#/수업 내용

json형식 직렬화, 역직렬화

Game Client Lee Hwanguk 2023. 1. 13. 01:54

#직렬화? = byte형태로 인스턴스를 변환

#역직렬화?=byte형태인 데이터를 인스턴스로 다시 변환

#byte와 bit

#1,기본형(직렬화-인스턴스를 byte형태로 변환)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; //꼭 작성해야한다
using System.IO; //꼭 작성해야한다

namespace Study14
{
    class App
    {
        public App()
        {
            //#1 직렬화
            //객체를 만들고 직렬화 해서 JSON형식 (문자열) 파일로 저장 
            //직렬화 : 아이템 객체를 넣어 주면 json문자열을 반환 
            //저장 
            Item item = new Item("창", 8); //1. 인스턴스 생성
            string json=JsonConvert.SerializeObject(item); //2.직렬화(json)형식으로 저장
            Console.WriteLine(json); //3.출력으로 확인
            File.WriteAllText("./my_item.json", json); //4.파일 저장








            //#2 역직렬화
            //역직렬화 
            //문자열 -> 객체 
            //역직렬화 



        }
    }
}

#1_1 역직렬화(byte형식을 다시 인스턴스로 변환)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; //꼭 작성해야한다
using System.IO; //꼭 작성해야한다
using System.Runtime.Serialization.Formatters.Binary;

namespace Study14
{
    class App
    {
        public App()
        {
            //#1 직렬화(byte 형태로 데이터를 변환)
            //객체를 만들고 직렬화 해서 JSON형식 (문자열) 파일로 저장 
            //직렬화 : 아이템 객체를 넣어 주면 json문자열을 반환 
            //저장 
            Item item = new Item("창", 8); //1. 인스턴스 생성(스트림을 만든다),(스트림=데이터가 지나가는 통로)
            //string json=JsonConvert.SerializeObject(item); //2.객체를 직렬화한다
            //Console.WriteLine(json); //3.출력으로 확인
            //File.WriteAllText("./my_item.json", json); //4.파일 저장


            //#2 역직렬화(byte로 변환된 Data를 원래대로 Object나 Data로 변환)
            //역직렬화 
            //문자열 -> 객체 
            string json = File.ReadAllText("./my_item.json");
            //역직렬화 
            JsonConvert.DeserializeObject<Item>(json);
            Console.WriteLine(item);
            Console.WriteLine("name: {0}, damage: {1}", item.name, item.damage);




        }
    }
}

 

#2. 리스트인스턴스 직렬화

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; //꼭 작성해야한다
using System.IO; //꼭 작성해야한다
using System.Runtime.Serialization.Formatters.Binary;

namespace Study14
{
    class App
    {
        public App()
        {
            //#1 직렬화(byte 형태로 데이터를 변환)
            //객체를 만들고 직렬화 해서 JSON형식 (문자열) 파일로 저장 
            //직렬화 : 아이템 객체를 넣어 주면 json문자열을 반환 
            //저장 
            //1. 인스턴스 생성(스트림을 만든다),(스트림=데이터가 지나가는 통로)
            //Item[] items = new Item[3]; //배열 인스턴스
            List<Item> items=new List<Item>(); //리스트 인스턴스
            items.Add(new Item("장검",8));
            items.Add(new Item("단검", 3));
            items.Add(new Item("도끼", 9));
            //2.객체를 직렬화한다
            string json=JsonConvert.SerializeObject(items);
            //3.출력으로 확인
            Console.WriteLine(json);
            //4.파일 저장
            File.WriteAllText("./my_item.json", json);


            //#2 역직렬화(byte로 변환된 Data를 원래대로 Object나 Data로 변환)
            //역직렬화 
            //문자열 -> 객체 
            
            //역직렬화 
            




        }
    }
}

#2_2 리스트를 다시 역직렬화 해보자

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; //꼭 작성해야한다
using System.IO; //꼭 작성해야한다
using System.Runtime.Serialization.Formatters.Binary;

namespace Study14
{
    class App
    {
        public App()
        {
            //#1 직렬화(byte 형태로 데이터를 변환)
            //객체를 만들고 직렬화 해서 JSON형식 (문자열) 파일로 저장 
            //직렬화 : 아이템 객체를 넣어 주면 json문자열을 반환 
            //저장 
            //1. 인스턴스 생성(스트림을 만든다),(스트림=데이터가 지나가는 통로)
            //Item[] items = new Item[3]; //배열 인스턴스
            List<Item> items=new List<Item>(); //리스트 인스턴스
            items.Add(new Item("장검",8));
            items.Add(new Item("단검", 3));
            items.Add(new Item("도끼", 9));
            //2.객체를 직렬화한다
            //string json=JsonConvert.SerializeObject(items);
            ////3.출력으로 확인
            //Console.WriteLine(json);
            ////4.파일 저장
            //File.WriteAllText("./my_item.json", json);


            //#2 역직렬화(byte로 변환된 Data를 원래대로 Object나 Data로 변환)
            //역직렬화 
            //문자열 -> 객체 
            string json = File.ReadAllText("./my_item.json");
            //Console.WriteLine(items);
            //역직렬화 
            JsonConvert.DeserializeObject<List<Item>>(json); //리스트를 다시 json으로 
            Console.WriteLine(json); //json으로 잘 변환된건지 출력해보자






        }
    }
}

#3. 배열을 직렬화해보자

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; //꼭 작성해야한다
using System.IO; //꼭 작성해야한다
using System.Runtime.Serialization.Formatters.Binary;

namespace Study14
{
    class App
    {
        public App()
        {
            //#1 직렬화(byte 형태로 데이터를 변환)
            //객체를 만들고 직렬화 해서 JSON형식 (문자열) 파일로 저장 
            //직렬화 : 아이템 객체를 넣어 주면 json문자열을 반환 
            //저장 
            //1. 인스턴스 생성(스트림을 만든다),(스트림=데이터가 지나가는 통로)
            Item[] items = new Item[3]; //배열 인스턴스
            //List<Item> items=new List<Item>(); //리스트 인스턴스
            items[0]=new Item("Sword",8);
            items[1]=new Item("dagger", 3);
            items[2]=new Item("Ax", 9);
            //2.객체를 직렬화한다
            string json=JsonConvert.SerializeObject(items);
            ////3.출력으로 확인
            Console.WriteLine(json);
            ////4.파일 저장
            //File.WriteAllText("./my_item.json", json);


            //#2 역직렬화(byte로 변환된 Data를 원래대로 Object나 Data로 변환)
            //역직렬화 
            //문자열 -> 객체 
            //string json = File.ReadAllText("./my_item.json");
            //Console.WriteLine(items);
            //역직렬화 
            //JsonConvert.DeserializeObject<Item>(json); //리스트를 다시 json으로 
            //Console.WriteLine(json); //json으로 잘 변환된건지 출력해보자






        }
    }
}

#json형식대로 키+벨류 형식으로 출력되었다

#3_1 json된 배열인스턴스를 다시 인스턴스화하고 List에 넣어서 for문으로 확인까지해보자 (배열의 인덱스들을 for문으로 돌며 배열[i]을 list.Add하는 방법이 계속 헷갈린다 연습이 많이 필요하다 카페에 컬렉션<T> 연습 템플릿으로 4가지 컬랙션들 연습을하자

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; //꼭 작성해야한다
using System.IO; //꼭 작성해야한다
using System.Runtime.Serialization.Formatters.Binary;

namespace Study14
{
    class App
    {
        public App()
        {
            //#1 직렬화(byte 형태로 데이터를 변환)
            //객체를 만들고 직렬화 해서 JSON형식 (문자열) 파일로 저장 
            //직렬화 : 아이템 객체를 넣어 주면 json문자열을 반환 
            //저장 
            //1. 인스턴스 생성(스트림을 만든다),(스트림=데이터가 지나가는 통로)
            //Item[] items = new Item[3]; //배열 인스턴스
            ////List<Item> items=new List<Item>(); //리스트 인스턴스
            //items[0] = new Item("Sword", 8);
            //items[1] = new Item("dagger", 3);
            //items[2] = new Item("Ax", 9);
            //2.객체를 직렬화한다
            //string json=JsonConvert.SerializeObject(items);
            ////3.출력으로 확인
            //Console.WriteLine(json);
            ////4.파일 저장
            //File.WriteAllText("./my_item.json", json);


            //#2 역직렬화(byte로 변환된 Data를 원래대로 Object나 Data로 변환)
            //역직렬화 
            //문자열 -> 객체 
            string json = File.ReadAllText("./my_item.json");
            Item[] items = JsonConvert.DeserializeObject<Item[]>(json);
            Console.WriteLine(items);
            List<Item> list = new List<Item>();
            for(int i=0; i<items.Length; i++)
            {
                list.Add(items[i]);
                Console.WriteLine(list.Count); //lsit에 3개는 잘들어간다 요소들을 꺼내서 확인도 하고싶다 2중 for문으로 돌려볼까
            }
            //역직렬화 
            //JsonConvert.DeserializeObject<Item>(json); //리스트를 다시 json으로 
            //Console.WriteLine(json); //json으로 잘 변환된건지 출력해보자






        }
    }
}

#4. Stack의 직렬화

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; //꼭 작성해야한다
using System.IO; //꼭 작성해야한다
using System.Runtime.Serialization.Formatters.Binary;

namespace Study14
{
    class App
    {
        public App()
        {
            //#1 직렬화(byte 형태로 데이터를 변환)
            //객체를 만들고 직렬화 해서 JSON형식 (문자열) 파일로 저장 
            //직렬화 : 아이템 객체를 넣어 주면 json문자열을 반환 
            //저장 
            //1. 인스턴스 생성(스트림을 만든다),(스트림=데이터가 지나가는 통로)
            Item item=new Item("단도", 2);
            Item item1=new Item("너클", 3);
            Stack<Item>stack=new Stack<Item>();
            stack.Push(item);
            stack.Push(item1);

            

            //2.객체를 직렬화한다
            string json=JsonConvert.SerializeObject(stack);

           //3.출력으로 확인
           Console.WriteLine(json);

            //4.파일 저장
            File.WriteAllText("./my_item.json", json);




            //#2 역직렬화(byte로 변환된 Data를 원래대로 Object나 Data로 변환)
            //역직렬화 
            //문자열 -> 객체 

            //역직렬화 
            //리스트를 다시 json으로 
            //json으로 잘 변환된건지 출력해보자






        }
    }
}

#4_1 Stack의 역직렬화