Serialization

tacoyaggi ㅣ 2024. 2. 2. 09:48

Serialization(직렬화) 란?

  • 직렬화는 객체를 저장 가능한 상태 or 전송 가능한 상태로 변환하는 것을 의미함. (직렬화 형태는 Binary, JSON, XML 이 있음)
  • 반대로 객체로 변환하는 것을 역직렬화라 함. (직렬화 형태에서 객체로 변환하는 것)

사용이유

  • 주로 데이터 전송 때문에 사용함. (A 와 B의 환경이 달라도 직렬화 데이터는 모든 시스템 환경에서 사용이 가능함.)
  • 결과적으로 데이터를 주고 받기 위한 약속~

직렬화 종류 , 특징

직렬화 종류는 JSON, XML, Binary 있다고 언급 했음.

JSON 직렬화에 대해서 알아보잣.

기존 .Net FrameWork 에서는 JsonConvert 클래스를 통해서 직렬화 , 역직렬화를 했는데
.NET6 부터 JsonSerializer 클래스가 기존 JsonConvert 를 대체 한 듯

역직렬화를 할 때는 Deserialize<T><T> 부분에 Entity 를 넣어주면 참으로 편함. 이유는 Key 명칭과 동일한 필드라면 알아서 매칭 시켜줌.

using System.Text.Json;

JsonEntity JsonEntity = new JsonEntity();
JsonEntity.No = 1;
JsonEntity.Name = "타코";
JsonEntity.Age = 31;

// JSON 직렬화
string jsonSerialized = JsonSerializer.Serialize(JsonEntity);

// JSON 역직렬화
JsonEntity = JsonSerializer.Deserialize<JsonEntity>(jsonSerialized);

public class JsonEntity
{
    public int No { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

아래 데이터는 위에서 직렬화한 jsonSerialized 값의 형태임.

JSON은 key : value 타입으로 데이터가 구성되어 있음.

직렬화시 문자열이 암호화 되는데, 역직렬화 할 때 다시 복원되니까 걱정 안해도 됨.

역직렬화 할 때, 해당 key 명칭과 동일한 No , Name , Age 가 포함되어 있는 Entityvalue 값이 매칭 됨.

{"No":1,"Name":"\uD0C0\uCF54","Age":31}

아래 코드는 XML 직렬화, 역직렬화 예제임.

JSON 과 다른점은 XmlSerializer serializer = new XmlSerializer(typeof(JsonEntity)) 이부분으로 XmlSerializer 클래스 인자로 Entity 타입을 추가해 줘야함.

직렬화 할 때 StringWriter 클래스가 필요하고 , 역직렬화 할 때 StringReader 클래스가 필요함.

직렬화는 XmlSerializer.Serialize(StringWriter,<Entity>) 형태로 StringWriter writer = new StringWriter() 클래스의 인스턴스에 저장 됨.

역직렬화는 StringReader reader = new StringReader(string) 형태로 인자로 XML 직렬화 문자열을 추가.

using System.Xml.Serialization;

JsonEntity JsonEntity = new JsonEntity();
JsonEntity.No = 1;
JsonEntity.Name = "타코";
JsonEntity.Age = 31;

string xmlSerialized = string.Empty;
XmlSerializer serializer = new XmlSerializer(typeof(JsonEntity));

// XML 직렬화
using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer,JsonEntity);
    xmlSerialized = writer.ToString();
}

// XML 역직렬화
using (StringReader reader = new StringReader(xmlSerialized))
{
    JsonEntity jsonEntity = (JsonEntity)serializer.Deserialize(reader);
}


public class JsonEntity
{
    public int No { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}


아래 소스는 JsonEntity 객체를 직렬화한 값임.

JSON 이랑은 형태가 완전히 다름 ㅎ

<?xml version="1.0" encoding="utf-16"?>
<JsonEntity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <No>1</No>
  <Name>타코</Name>
  <Age>31</Age>
</JsonEntity>

 

'SW 기능 > C#' 카테고리의 다른 글

Struct  (0) 2024.02.02
Static  (0) 2024.02.02
Reflection  (0) 2024.02.02
OverLoading, Override  (0) 2024.02.02
nameof  (0) 2024.02.02