1. 개요
처음 단어를 접했을 때 생소했던 그 단어
리플렉션 시스템을 공부하며 스쳐갔던 그 단어
오늘은 직렬화(?)에 대해 살펴본다.
2. 직렬화란?

'직렬화'에서 직렬이라는 단어는 "일렬로 연결하는 일"을 뜻한다.
그렇다면 무엇을 일렬로 연결하는 것일까?
바로 '메모리 데이터'이다.
그것도 현재 프로그램에서 사용 중인 메모리 데이터이다.
즉, 현재 시점의 싱싱한 메모리 데이터(객체)들을 골라모아 한 줄로 모으는 작업을 직렬화라고 한다.
2.1 직렬화 역할

이렇게 한줄로 저장된 데이터는 필요한 데이터만 담아놓은 바이트 배열되며
이는 외부에서 전달받을 수 있는 상태가 된다. (택배 상자를 포장하듯)
반대편에서는 바이트 배열을 전달받고
이를 다시 역직렬화(DeSerialization), 직렬화 과정의 반대 작업을 거쳐 사용 가능한 데이터로 변환한다.
직렬화는 다음과 같은 상황에서 사용된다.
- 메모리 데이터를 파일로 저장할 때 (게임 데이터 저장)
- 메모리 데이터를 서버로 전달할 때 (클라이언트 데이터 동기화)
- 메모리 데이터를 프로그램으로 전달할 때 (클립보드: 프로그램 간 이미지 전달하기)
2.2 직렬화 활용
언리얼에서는 직렬화 시스템을 자제적으로 지원해준다.
파일, 메모리, 네트워크에 데이터를 전송하는 모든 매체는 아카이브 클래스 FArchive 를 상속받아서 구현한다.
예제를 통해 구조체를 파일로 저장하고 불러들이는 코드를 살펴보자.
// 구조체
struct FItemInfo
{
FItemInfo(){}
FItemInfo(int32 InOrder, const FString& InName) : Order(InOrder), Name(InName) {}
int32 Count;
FString Name;
// FArchive 객체에서 'operat<<'의 함수 접근을 허용한다 (friend!)
friend FArchive& operator<<(FArchive& Ar, FItemInfo& InItemInfo)
{
Ar << InItemInfo.Name;
Ar << InItemInfo.Count;
return Ar;
}
};
void Init()
{
FItemInfo RawDataSrc(10, TEXT("물약 포션"));
// 1. 저장할 파일 경로를 설정한다. (프로젝트 경로/Saved)
const FString SaveDir = FPaths::Combine(FPaths::ProjectDir() , TEXT("Saved"));
const FString RawDataFileName(TEXT("InventoryData.bin"));
// 2. 유효한 파일 경로 문자열로 변환한다.
FString RawDataAbsolutePath = FPaths::Combine(*SaveDir, *RawDataFileName);
FPaths::MakeStandardFilename(RawDataAbsolutePath);
{
// 3. 해당 경로에 파일을 쓰기 모드로 접근한다.
FArchive* RawFileWriterAr = IFileManager::Get().CreateFileWriter(*RawDataAbsolutePath); // 아카이브 클래스 생성 ( Writer Mode )
if (nullptr != RawFileWriterAr)
{
*RawFileWriterAr << RawDataSrc;
RawFileWriterAr->Close();
// 4. RawFileWriterAr 메모리 정리
// "F" 접두사로 시작하는 CPP 클래스이며
// 리플레션 시스템에 의해 메모리 관리가 자동으로 이루어지지 않는다.
delete RawFileWriterAr;
RawFileWriterAr = nullptr;
}
// 4. 해당 경로에 파일을 읽기 모드로 접근한다.
FSerializeTargetStruct RawDataDest;
FArchive* RawFileReaderAr = IFileManager::Get().CreateFileReader(*RawDataAbsolutePath);
if (nullptr != RawFileReaderAr)
{
*RawFileReaderAr << RawDataDest;
RawFileReaderAr->Close();
delete RawFileReaderAr;
RawFileReaderAr = nullptr;
}
}
}
3. 정리
- 메모리상에 흩어진 데이터를 파일, 프로그램, 네트워크로 전달할 때는 직렬화라는 기술을 사용한다.
- 언리얼에서는 직렬화 시스템을 "FArchive"라는 클래스로 지원한다.
- 게임 개발시 게임 세이브 기능, 서버 데이터 전달 등에 사용될 것으로 생각된다.
참고
Serialization and Deserialization in Java | by Mmertkaragoz | Medium
Juggling with Bits and Bytes | Apache Flin
A Beginner’s Guide to Data Serialization Systems | by Dunith Danushka | Level Up Codin
'Unrael > Basic' 카테고리의 다른 글
| [UE/Basic] 입력 트리거 (0) | 2025.01.27 |
|---|---|
| [UE/Basic] 자료구조 - TSet (0) | 2025.01.24 |
| [UE/Basic] 자료구조 - TArray (0) | 2025.01.22 |
| [UE/Basic] 액터의 라이프 사이클 (1) | 2025.01.21 |
| [UE/Basic] 델리게이트 (0) | 2025.01.07 |