본문 바로가기

C# 문법

[C#] XML Serialization / Deserialization

  • Class(객체)를 XML로 바꾸어 저장하는 것을 XML Serializer이라 한다.
  • XML을 Class로 복원하는 것을 XML Deserialize이라 부른다.
  • 메모리상에 XML값을 저장하거나, 혹은 네트워크에서 Stream으로 만들어 외부에 보낼 때 사용된다.
  • XML Serializer

    public class History
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public List<string> Friends { get; set; }
    }
    public void Run()
    {
        History hClass = new History();
        hClass.Name = "양뱅";
        hClass.Age = 33;
        hClass.Friends = new List<string>() { "양뱅", "쏭", "태발", "털", "쩌주" };
        //Xml File 만들기 
        // Debug에 exe 생성하는 폴더에 저장
        using(StreamWriter fs = new StreamWriter(@"../commoncafe.xml"))
        {
            XmlSerializer xmlSeri = new XmlSerializer(typeof(History));
            xmlSeri.Serialize(fs, hClass);
        }
        //Console 에 출력
        {
            XmlSerializer xmlSeri = new XmlSerializer(typeof(History));
            xmlSeri.Serialize(Console.Out, hClass);
            //xmlSeri.Serialize(첫번째 매개변수는 TextWriter로 어디에 값을 쓸 것인지 정해주면 된다.)
        }
    }

    결과

    <?xml version="1.0" encoding="Codepage - 949"?>
    <History xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Name>양뱅</Name>
      <Age>33</Age>
      <Friends>
        <string>양뱅</string>
        <string>쏭</string>
        <string>태발</string>
        <string>털</string>
        <string>쩌주</string>
      </Friends>
    </History>

    XML Deserialize

    public class History
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public List<string> Friends { get; set; }
    }
    public void Run()
    {
        History his = new History();
        // Debug에 exe 생성하는 폴더에 에서 불러온다.
        using (StreamReader fs = new StreamReader(@"./commoncafe.xml"))
        {
            XmlSerializer xmlSeri = new XmlSerializer(typeof(History));
            his = (History)xmlSeri.Deserialize(fs);
            //위에 내용이 완료되면, History Class에 내용이 채워져 있다.
        }
        //내용이 잘 저장 되었는지 Consol에 표시해 보겠습니다.
        his.GetType().GetProperties().Select(f => new {
            name = f.Name,
            value = f.PropertyType.Equals(typeof(List<string>)) ? string.Join(",", (List<string>)f.GetValue(his)) : f.GetValue(his)
        })
        .ToList()
        .ForEach(f => { Console.WriteLine($"{f.name} : {f.value}");  });
    }

    결과

    Name : 양뱅
    Age : 33
    Friends : 양뱅,쏭,태발,털,쩌주