본문 바로가기

프로그래밍/C# 프로그래밍

C# 파일 직렬화 - BinaryFormatter

귀찮아서 풀소스로 설명


using System;

using System.IO;

using System.Collections;

using System.Runtime.Serialization.Formatters.Binary;

using System.Runtime.Serialization;


public class App

{

    [STAThread]


    static void Serialize()

    {

        // 사용할 데이터로는 해쉬테이블을 사용한다. 정적데이터를 사용할때에는

       // 그냥 파일스트림에 집어넣어도 되지만,

       // 동적데이터나 컨테이너를 사용할 경우 직렬화를 반드시 해줘야하기 때문이다.


        Hashtable addresses = new Hashtable();

        addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");

        addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");

        addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");


        // 직렬화 전에 파일스트림을 오픈해준다.

        FileStream fs = new FileStream("DataFile.dat", FileMode.Create);


        // BinaryFormatter 는 직렬화를 해주는 역할을 한다.

        BinaryFormatter formatter = new BinaryFormatter();

        try

        {

            formatter.Serialize(fs, addresses);

        }

        catch (SerializationException e)

        {

            Console.WriteLine("Failed to serialize. Reason: " + e.Message);

            throw;

        }

        finally

        {

            fs.Close();

        }

    }



    static void Deserialize()

    {

        // 받아올 해쉬테이블을 선언해주고

        Hashtable addresses = null;


        // 직렬화된 파일을 오픈해 준다.

        FileStream fs = new FileStream("DataFile.dat", FileMode.Open);

        try

        {

            BinaryFormatter formatter = new BinaryFormatter();


            // 직렬화를 해제해준다

            addresses = (Hashtable)formatter.Deserialize(fs);

        }

        catch (SerializationException e)

        {

            Console.WriteLine("Failed to deserialize. Reason: " + e.Message);

            throw;

        }

        finally

        {

            fs.Close();

        }


        // 제대로 직렬화가 해제됐는지 확인하기 위해 순서대로 해쉬테이블을 찍어본다


        foreach (DictionaryEntry de in addresses)

        {

            Console.WriteLine("{0} lives at {1}.", de.Key, de.Value);

        }

   // 잘 나오네.. 끝 ㅋㅋ

    }



    static void Main()

    {

        Serialize();

        Deserialize();

    }

}


결론적으로 직렬화를 위해서 BinaryFormatter 클래스를 이용하면 된다.


이름설명
System_CAPS_pubmethodBinaryFormatter()

기본값으로 BinaryFormatter 클래스의 새 인스턴스를 초기화합니다.

System_CAPS_pubmethodBinaryFormatter(ISurrogateSelector, StreamingContext)

제공된 서로게이트 선택기와 스트리밍 컨텍스트를 사용하여 BinaryFormatter 클래스의 새 인스턴스를 초기화합니다.

이름설명
System_CAPS_pubpropertyAssemblyFormat

어셈블리를 찾고 로드하는 작업과 관련된 deserializer 동작을 가져오거나 설정합니다.

System_CAPS_pubpropertyBinder

형식에 대해 serialize된 개체를 제어하는 SerializationBinder 형식의 개체를 가져오거나 설정합니다.

System_CAPS_pubpropertyContext

이 포맷터에 대한 StreamingContext를 가져오거나 설정합니다.

System_CAPS_pubpropertyFilterLevel

BinaryFormatter가 수행하는 자동 deserialization의 TypeFilterLevel을 가져오거나 설정합니다.

System_CAPS_pubpropertySurrogateSelector

serialization 및 deserialization을 수행하는 동안 형식 대체를 제어하는 ISurrogateSelector를 가져오거나 설정합니다.

System_CAPS_pubpropertyTypeFormat

serialize된 스트림에서 형식 설명을 레이아웃하는 형식을 가져오거나 설정합니다.

이름설명
System_CAPS_pubmethodDeserialize(Stream)

지정된 스트림을 개체 그래프로 deserialize합니다.

System_CAPS_pubmethodDeserialize(Stream, HeaderHandler)

지정된 스트림을 개체 그래프로 deserialize합니다.이렇게 되면 제공된 HeaderHandler가 해당 스트림의 모든 헤더를 처리합니다.

System_CAPS_pubmethodDeserializeMethodResponse(Stream, HeaderHandler, IMethodCallMessage)

지정된 Stream의 원격 메서드 호출에 대한 응답을 deserialize합니다.

System_CAPS_pubmethodEquals(Object)

지정한 개체가 현재 개체와 같은지 여부를 확인합니다. (Object에서 상속됨.)

System_CAPS_pubmethodGetHashCode()

기본 해시 함수로 작동합니다. (Object에서 상속됨.)

System_CAPS_pubmethodGetType()

현재 인스턴스의 Type을 가져옵니다.(Object에서 상속됨.)

System_CAPS_pubmethodSerialize(Stream, Object)

개체나 지정된 최상위(루트)를 가진 개체의 그래프를 해당 스트림으로 serialize합니다.

System_CAPS_pubmethodSerialize(Stream, Object, Header[])

개체나 지정된 최상위(루트)를 가진 개체의 그래프를 제공된 헤더가 첨부된 해당 스트림으로 serialize합니다.

System_CAPS_pubmethodToString()

현재 개체를 나타내는 문자열을 반환합니다.(Object에서 상속됨.)

System_CAPS_pubmethodUnsafeDeserialize(Stream, HeaderHandler)

지정된 스트림을 개체 그래프로 deserialize합니다.이렇게 되면 제공된 HeaderHandler가 해당 스트림의 모든 헤더를 처리합니다.

System_CAPS_pubmethodUnsafeDeserializeMethodResponse(Stream, HeaderHandler, IMethodCallMessage)

지정된 Stream의 원격 메서드 호출에 대한 응답을 deserialize합니다.



참고로 직렬화란 네트웍전송 같은 스트리밍을 위해 연속된 Byte단위의 메모리로 변환하여 송수신이 가능하게 만드는걸 의미한다.

예제에서는 그것을 가지고 다시 객체화하여 사용하였다.


만약에 사용할 데이터를 Class로 한다면, [Serializable] 를 붙여 직렬화 할 수 있도록 만들어야 한다.

'프로그래밍 > C# 프로그래밍' 카테고리의 다른 글

C# - Application.Exit() 먹히지 않는 이유  (0) 2017.01.20
C# FileStream MemoryStream  (0) 2015.12.23
C# 6.0 새로운 기능  (0) 2015.12.10
C# 의 define 처리  (0) 2015.12.01
C# Math 함수 모음집  (0) 2015.11.30