Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 직렬화(Serialization)와 역직렬화(Deserialization) 완벽 가이드

직렬화(Serialization)는 객체를 바이트 스트림(byte stream) 형태로 변환하여 스트림에 기록할 수 있는 상태로 만드는 과정입니다. 이를 통해 객체를 메모리, 파일 또는 데이터베이스에 저장하거나 네트워크를 통해 전송할 수 있습니다.

C#에서 직렬화는 크게 다음 두 가지 방식으로 수행할 수 있습니다.

1. 이진 직렬화(Binary Serialization)

이진 직렬화는 BinaryFormatter를 사용하여 객체를 이진(binary) 형식으로 변환합니다. 이 방식은 읽기 전용(read-only) 멤버를 포함하여 객체의 모든 멤버를 직렬화한다는 특징이 있습니다. 변환된 데이터는 사람이 읽을 수 없지만 크기가 작고 처리 속도가 빠릅니다.

참고: 최신 .NET(.NET 5 이상)에서는 보안 취약점 때문에 BinaryFormatter가 더 이상 권장되지 않으며, 대신 System.Text.Json이나 MessagePack 같은 안전한 직렬화 도구를 사용하는 것이 좋습니다.

2. XML 직렬화(XML Serialization)

XML 직렬화는 객체의 public 필드와 속성만을 특정 XML 스키마 정의 언어(XSD) 문서 규격에 맞는 XML 스트림으로 변환합니다. 결과물이 텍스트 기반이므로 사람이 읽기 쉽고, 서로 다른 시스템 간의 데이터 교환에 유용합니다.

실습 예제

먼저 파일에 쓰기 위한 스트림과 포매터(formatter)를 설정합니다.

FileStream fStream = new FileStream("d:\\new.txt", FileMode.OpenOrCreate);
BinaryFormatter formatter = new BinaryFormatter();

다음으로 직렬화할 클래스의 객체를 생성하고, 세 개의 매개변수를 받는 생성자를 호출합니다.

Employee emp = new Employee(30, "Tom", "Operations");

이제 Serialize() 메서드를 호출하여 객체를 직렬화합니다.

formatter.Serialize(fStream, emp);

역직렬화(Deserialization)

역직렬화(Deserialization)는 직렬화의 반대 과정입니다. 저장된 바이트 스트림을 다시 원래의 객체 상태로 복원하는 것으로, 이를 통해 파일이나 메모리에 저장된 데이터를 프로그램에서 다시 사용할 수 있습니다.

Employee restoredEmp = (Employee)formatter.Deserialize(fStream);

Deserialize() 메서드는 object 타입을 반환하므로, 위 코드처럼 원래 클래스 타입으로 명시적 형변환(casting)을 해주어야 합니다.