▶ 직렬화란?
MSDN을 살펴보면, 직렬화(Serialization)란 객체를 쉽게 옮길 수 있는 형태로 변환하는 과정이라고 나와 있죠.
객체를 직렬화하여, 직렬화된 객체를 HTTP를 사용하여 클라이언트-서버간에 옮길 수 있죠.
▶ 역직렬화(Deserialization)란?
직렬화와는 반대되는 기능을 수행합니다. 즉, 스트림에서 객체를 재구성합니다.
▶ 직렬화의 두 가지 기법
① 바이너리 직렬화(Binary serialization)
바이너리 직렬화는, 타입이 원래 객체의 타입과 똑같도록 보존해 줍니다.
객체의 상태를 다른 응용프로그램 호출 사이에 보존하고자 할 때 유용합니다.
② XML 직렬화(XML serialization)
XML 직렬화는 공용 프로퍼티와 공용 필드만 직렬화합니다.
바이너리 직렬화와는 달리, 타입이 원래 객체의 타입과 똑같도록 보존해 주지는 않습니다.
웹상에서 데이터를 공유할 때, XML 은 탁월한 선택이 될 것입니다.
▶ 바이너리 직렬화
간단하게 바이너리 직렬화/역직렬화 하는 방법을 살펴보죠.
① 바이너리 직렬화를 위한 네임스페이스 선언
using System.IO; // 파일 입출력 스트림 using System.Runtime.Serialization.Formatters.Binary; // 바이너리 포맷터 using System.Runtime.Serialization; //IFormatter 인터페이스 사용 |
바이너리 직렬화 하기 위해서는 위와 같은 3개의 네임스페이스를 using 구문을 통해 선언해 줍니다.
② 직렬화할 객체 정의
[Serializable] public class MySerialObject { public int Int1 = 0; public int Int2 = 0; public int Int3 = 0; private string str = null;
public string STR { get { return str; }
set { str = value; } }
public void DisplayMember(string Header) { Console.WriteLine("** " + Header + " **"); Console.WriteLine("Member 1 ==> " + Int1.ToString()); Console.WriteLine("Member 2 ==> " + Int2.ToString()); Console.WriteLine("Member 3 ==> " + Int3.ToString()); Console.WriteLine("Member 4 ==> " + STR); Console.WriteLine(""); } } |
바이너리 직렬화를 할 클래스에 [Serializable] 어트리뷰트를 설정합니다.
③ 직렬화/역직렬화 수행
static void Main(string[] args) { MySerialObject obj = new MySerialObject(); obj.Int1 = 1; obj.Int2 = 24; obj.Int3 = 100; obj.STR = "Some String";
obj.DisplayMember("원래 객체);
IFormatter formatter = new BinaryFormatter(); Stream streamWrite = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); formatter.Serialize(streamWrite, obj); streamWrite.Close();
Stream streamRead = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.None); MySerialObject deserialObj = (MySerialObject)formatter.Deserialize(streamRead); streamRead.Close();
deserialObj.DisplayMember("역직렬화로 생성한 객체); Console.ReadLine(); } |
크게 어려울 것은 없습니다.
obj 라는 직렬화 할 객체를 생성한 뒤, 알맞게 설정합니다.
MySerialObject obj = new MySerialObject(); obj.Int1 = 1; obj.Int2 = 24; obj.Int3 = 100; obj.STR = "Some String"; |
그리고, 파일 스트림과, 바이너리 포맷터를 이용해서 직렬화를 수행합니다.
IFormatter formatter = new BinaryFormatter(); Stream streamWrite = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); formatter.Serialize(streamWrite, obj); streamWrite.Close(); |
이 예제는 파일에 직렬화를 수행했습니다.
그럼, 파일에서 역직렬화를 하면, 원래 객체와 똑같은 새로운 객체를 만들 수 있습니다.
Stream streamRead = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.None); MySerialObject deserialObj = (MySerialObject)formatter.Deserialize(streamRead); streamRead.Close(); |
프로그램 결과를 보시죠.
어떤가요? 감이 오나요?
매우 간단한 바이너리 직렬화/역직렬화 였습니다.
XML 직렬화/역직렬화도 간단합니다.
여기까지만 설명합니다.
'컴퓨터' 카테고리의 다른 글
[C언어] 전처리기 (0) | 2012.11.09 |
---|---|
[java] 접근 지정자 (private, public, protected, default) (0) | 2012.10.30 |
[ADO.NET] SqlConnection를 사용하여 MS SQL DB 연동하기 (0) | 2012.10.17 |
[C언어] C Standard Library (0) | 2012.10.15 |
[MYSQL][EXCEL][XML] MYSQL에 있는 데이터를 EXCEL을 이용하여 XML로 변환 하는 방법 (0) | 2012.10.12 |