본문 바로가기
컴퓨터

직렬화, 역직렬화

by Luyin 2012. 10. 19.

▶ 직렬화란?


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 직렬화/역직렬화도 간단합니다.


여기까지만 설명합니다.



참조 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040102&docId=67511763&qb=c3RyZWFtIHNlcmlhbGl6ZQ==&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=R4uioc5Y7uosssU2aWRssc--377822&sid=UICZoKCKgFAAAAX2Dls