귀찮아서 풀소스로 설명
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 클래스를 이용하면 된다.
이름 | 설명 | |
---|---|---|
BinaryFormatter() | 기본값으로 BinaryFormatter 클래스의 새 인스턴스를 초기화합니다. | |
BinaryFormatter(ISurrogateSelector, StreamingContext) | 제공된 서로게이트 선택기와 스트리밍 컨텍스트를 사용하여 BinaryFormatter 클래스의 새 인스턴스를 초기화합니다. |
이름 | 설명 | |
---|---|---|
AssemblyFormat | 어셈블리를 찾고 로드하는 작업과 관련된 deserializer 동작을 가져오거나 설정합니다. | |
Binder | 형식에 대해 serialize된 개체를 제어하는 SerializationBinder 형식의 개체를 가져오거나 설정합니다. | |
Context | 이 포맷터에 대한 StreamingContext를 가져오거나 설정합니다. | |
FilterLevel | BinaryFormatter가 수행하는 자동 deserialization의 TypeFilterLevel을 가져오거나 설정합니다. | |
SurrogateSelector | serialization 및 deserialization을 수행하는 동안 형식 대체를 제어하는 ISurrogateSelector를 가져오거나 설정합니다. | |
TypeFormat | serialize된 스트림에서 형식 설명을 레이아웃하는 형식을 가져오거나 설정합니다. |
이름 | 설명 | |
---|---|---|
Deserialize(Stream) | 지정된 스트림을 개체 그래프로 deserialize합니다. | |
Deserialize(Stream, HeaderHandler) | 지정된 스트림을 개체 그래프로 deserialize합니다.이렇게 되면 제공된 HeaderHandler가 해당 스트림의 모든 헤더를 처리합니다. | |
DeserializeMethodResponse(Stream, HeaderHandler, IMethodCallMessage) | 지정된 Stream의 원격 메서드 호출에 대한 응답을 deserialize합니다. | |
Equals(Object) | ||
GetHashCode() | 기본 해시 함수로 작동합니다. (Object에서 상속됨.) | |
GetType() | ||
Serialize(Stream, Object) | 개체나 지정된 최상위(루트)를 가진 개체의 그래프를 해당 스트림으로 serialize합니다. | |
Serialize(Stream, Object, Header[]) | 개체나 지정된 최상위(루트)를 가진 개체의 그래프를 제공된 헤더가 첨부된 해당 스트림으로 serialize합니다. | |
ToString() | 현재 개체를 나타내는 문자열을 반환합니다.(Object에서 상속됨.) | |
UnsafeDeserialize(Stream, HeaderHandler) | 지정된 스트림을 개체 그래프로 deserialize합니다.이렇게 되면 제공된 HeaderHandler가 해당 스트림의 모든 헤더를 처리합니다. | |
UnsafeDeserializeMethodResponse(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 |