본문 바로가기
Programming/C# & .NET

[C#] XML 직렬화, 역직렬화 (Serialize, Deserialize)

by Kor-IT 2023. 1. 6.
반응형

C# 직렬화, 역직렬화  (Serialize, Deserialize)

 

해당 글에서는 XML 직렬화, 역직렬화하는 방법을 알 수 있다. 간단하게 직렬화와 역직렬화를 설명하겠다.

직렬화는 객체를 바이너리 형식으로 변환하는거며 역직렬화는 바이너리를 객체로 변환하는 거다. 직렬화와 역직렬화는 결국 반대의 일을 해주는 것이다. 데이터를 주고받는 형식으로 JSON 외 XML이 주로 사용되고 있으니 알아두면 유용하게 사용할 수 있다.

 

 

 

XmlSerializer 


네임스페이스 : System.Xml.Serialization
어셈블리 : System.Xml.XmlSerializer.dll

XMl 형식으로 객체를 직렬화하고, 역직렬화 하는데 사용하는 클래스이다.

 

 

XmlSerializer 클래스 (System.Xml.Serialization)

XML 문서로 개체를 직렬화하고 XML 문서에서 개체를 역직렬화합니다. XmlSerializer를 사용하면 개체가 XML로 인코딩되는 방식을 제어할 수 있습니다.

learn.microsoft.com

 

 

아래 직렬화, 역직렬화 예시는 학교(School) 관련 정보를 기반으로 간략한 예시로 설명하도록 하겠다.

 

 

Class


School

[Serializable]
[XmlRoot(elementName: "school")]
public class School
{
    [XmlElement(elementName: "name")]
    public string Name { get; set; }

    [XmlElement(elementName: "location")]
    public string Location { get; set; }

    [XmlElement(elementName: "students")]
    public int Students { get; set; }
}

 

Schools

[Serializable]
[XmlRoot(elementName: "schools")]
public class Schools
{
    [XmlElement(elementName: "school")]
    public List<School> schoolList { get; set; }
}

 

 

직렬화 (Serialize)


XmlSerializer xs = new XmlSerializer(typeof(Schools));

Schools schools = new Schools()
{
    schoolList = new List<School>()
};

Enumerable.Range(1, 3).ToList().ForEach(x =>
{
    schools.schoolList.Add(new School()
    {
        Name = $"{x}-School",
        Location = "Seoul",
        Students = x * 1000

    });
});

using (StringWriter sw = new StringWriter())
{
    xs.Serialize(sw, schools);
    Console.WriteLine(sw.ToString());
}

List<School> 에 3개의 데이터를 등록 후 직렬화 하는 코드이다.

 

[출력]

<?xml version="1.0" encoding="utf-16"?>
<schools xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <school>
    <name>1-School</name>
    <location>Seoul</location>
    <students>1000</students>
  </school>
  <school>
    <name>2-School</name>
    <location>Seoul</location>
    <students>2000</students>
  </school>
  <school>
    <name>3-School</name>
    <location>Seoul</location>
    <students>3000</students>
  </school>
</schools>

 

 

역직렬화 (Deserialize)


string xmlData = @"<schools>
                      <school>
                        <name>ABC School</name>
                        <location>New York, NY</location>
                        <students>1000</students>
                      </school>
                      <school>
                        <name>XYZ School</name>
                        <location>Los Angeles, CA</location>
                        <students>1500</students>
                      </school>
                    </schools>";

Schools schools = new Schools();

using (StringReader sr = new StringReader(xmlData))
{
    schools = (Schools)xs.Deserialize(sr);
}

foreach (School school in schools.schoolList)
{
    Console.WriteLine($"{school.Name} / {school.Location} / {school.Students}");
}
[출력]

ABC School / New York, NY / 1000
XYZ School / Los Angeles, CA / 1500

 

반응형

댓글