C# 직렬화
정의 - 직렬화(Serialization)는 개체(Object)를 저장하거나, 메모리(Memory), 데이터베이스(Database) 또는 파일(File)로 전송하기 위해 개체를
바이트 스트림으로 변환하는 프로세스를 말합니다.
목적 - 저장이나 전송 후 다시 개체로 만들기 위함입니다.
역 프로세스 - 역직렬화(deserialization)로 객체를 재구성합니다.
작동방법 - 개체는 스트림(Stream : 데이터, 패킷, 비트 등의 일련의 연속성을 갖는 흐름을 의미)으로 직렬화되어, 데이터뿐 아니라 버전, 문화권 및 어셈블리 이름과 같은 개체 형식에
대한 데이터를 운반할 수 있습니다.
직렬화 기법
이진 직렬화(Binary Serialization)
이진 직렬화(Binary Serialization)는 이진 인코딩을 사용하여 저장소(Storage:데이터 저장장치) 또는 소켓 기반 네트워크 스트림과 같은
용도에서 사용할 수 있는 압축된 직렬화(Serialization)를 생성합니다.
XML 직렬화(XML Serialization)
XML 직렬화(XML Serialization)는 개체의 public 필드와 속성 또는 메서드의 매개 변수와 반환 값을 특정 XSD(XML 스키마 정의 언어)
문서와 일치하는 XML 스트림으로 직렬화(Serialization) 합니다.
이진 직렬화(Binary Serialization) 실제 구현
전체 소스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO; // 파일 입출력 스트림을 위해 추가
using System.Runtime.Serialization.Formatters.Binary; // 바이너리 포맷을 위해 추가
using System.Runtime.Serialization; // IFormatter 인터페이스 사용을 위해 추가
[Serializable]
public class DataObject
{
public int num1;
public int num2;
}
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
DataObject data1 = new DataObject();
data1.num1 = 1;
data1.num2 = 2;
IFormatter formatter = new BinaryFormatter();
Stream streamFileWrite = new FileStream("tttt.txt", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(streamFileWrite, data1);
streamFileWrite.Close();
Stream streamFileRead = new FileStream("tttt.txt", FileMode.Open, FileAccess.Read, FileShare.None);
DataObject data2 = (DataObject)formatter.Deserialize(streamFileRead);
streamFileRead.Close();
Console.WriteLine("num1 : " + data2.num1);
Console.WriteLine("num2 : " + data2.num2);
}
}
}
|
cs |
세부 설명
1. 이진 직렬화에 필요한 네임스페이스 선언
1
2
3
|
using System.IO; // 파일 입출력 스트림을 위해 추가
using System.Runtime.Serialization.Formatters.Binary; // 바이너리 포맷을 위해 추가
using System.Runtime.Serialization; // IFormatter 인터페이스 사용을 위해 추가
|
cs |
2. 직렬화할 클래스(혹은 객체)를 정의
1
2
3
4
5
6
|
[Serializable]
public class DataObject
{
public int num1;
public int num2;
}
|
cs |
꼭 [Serializable]를 붙여야 합니다.
3. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
DataObject data1 = new DataObject();
data1.num1 = 1;
data1.num2 = 2;
IFormatter formatter = new BinaryFormatter();
Stream streamFileWrite = new FileStream("tttt.txt", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(streamFileWrite, data1);
streamFileWrite.Close();
Stream streamFileRead = new FileStream("tttt.txt", FileMode.Open, FileAccess.Read, FileShare.None);
DataObject data2 = (DataObject)formatter.Deserialize(streamFileRead);
streamFileRead.Close();
Console.WriteLine("num1 : " + data2.num1);
Console.WriteLine("num2 : " + data2.num2);
}
}
}
|
cs |
Stream streamFileWrite = new FileStream("tttt.txt", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(streamFileWrite, data1);
streamFileWrite.Close();
여기서 data1 객체를 직렬화한 후 tttt.txt에 저장합니다.
파일로 열어보면 다음과 같습니다.
알아볼 수 없도록 이진화로 되어있는 것을 볼 수 있습니다.
그 후
Stream streamFileRead = new FileStream("tttt.txt", FileMode.Open, FileAccess.Read, FileShare.None);
DataObject data2 = (DataObject)formatter.Deserialize(streamFileRead);
streamFileRead.Close();
이 부분에서 다시 역직렬화합니다.
출력된 데이터를 확인해보면 제대로 데이터가 역직렬화된 것을 알 수 있습니다.
'개발공부 > C#' 카테고리의 다른 글
[C#] yield (0) | 2019.10.14 |
---|---|
[C#] 반복문 (0) | 2019.10.13 |
[C#] 조건문 (0) | 2019.10.12 |
[C#] 연산자 (0) | 2019.10.10 |
[C#] 데이터 타입 (0) | 2019.10.09 |