직렬화(Serialization)는 객체(Object)를 바이트 스트림(Byte Stream) 형태로 변환하여, 스트림에 기록할 수 있는 상태로 만드는 과정입니다. 이렇게 변환된 데이터는 메모리, 파일, 데이터베이스 등에 저장할 수 있으며, 필요할 때 역직렬화(Deserialization)를 통해 원래의 객체로 복원할 수 있습니다.
C# .NET에서 직렬화는 크게 다음 두 가지 방식으로 수행할 수 있습니다.
1. 이진 직렬화 (Binary Serialization)
객체의 모든 멤버를 직렬화하는 방식입니다. 읽기 전용(read-only) 멤버까지 포함되므로, 객체의 상태를 그대로 완벽하게 저장해야 할 때 유용합니다. 다만 출력 결과가 사람이 읽기 어려운 이진 형식이라는 점에 유의해야 합니다.
2. XML 직렬화 (XML Serialization)
객체의 public 필드와 속성만 직렬화하는 방식입니다. 결과물은 특정 XML 스키마 정의 언어(XSD, XML Schema Definition Language) 문서를 준수하는 XML 스트림으로 변환되므로, 사람이 읽기 쉽고 시스템 간 데이터 교환에 적합합니다.
직렬화 예제 코드
먼저 파일에 데이터를 쓰기 위한 스트림을 설정합니다.
FileStream fstream = new FileStream("d:\\new.txt", FileMode.OpenOrCreate);
BinaryFormatter formatter = new BinaryFormatter();다음으로 클래스의 객체를 생성하고, 세 개의 매개변수를 받는 생성자를 호출합니다.
Employee emp = new Employee(030, "Tom", "Operations");
마지막으로 Serialize() 메서드를 호출하여 객체를 직렬화합니다.
formatter.Serialize(fstream, emp);
위 코드가 실행되면 Employee 객체의 데이터가 지정된 파일(d:\new.txt)에 바이트 스트림 형태로 저장됩니다.
참고 사항
예제에 사용된 BinaryFormatter는 보안 취약점(역직렬화 공격) 문제로 인해 최신 .NET 버전(.NET 5 이상)에서는 사용이 권장되지 않으며, 대신 System.Text.Json이나 DataContractSerializer 같은 안전한 직렬화 방식을 사용하는 것이 좋습니다.