[UE/Basic] 직렬화 (Serialization)

2025. 1. 23. 20:09·Unrael/Basic

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

http://heukkellsoft.net/HeukKellLab/Page/UnrealEngine/Archietecture/UObject/Concept/Serialization/Page.html

'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
'Unrael/Basic' 카테고리의 다른 글
  • [UE/Basic] 입력 트리거
  • [UE/Basic] 자료구조 - TSet
  • [UE/Basic] 자료구조 - TArray
  • [UE/Basic] 액터의 라이프 사이클
DevColIn
DevColIn
복잡함을 단순하게
  • DevColIn
    심플한 코딩생활
    복잡함을 단순하게
  • 전체
    오늘
    어제
    • 전체보기 (223)
      • Unreal 부트캠프 (49)
        • TIL (34)
        • 사전캠프 (7)
        • 본캠프 (8)
      • Unrael (10)
        • 환경설정 (0)
        • Basic (19)
        • Component (5)
        • GAS (GameplayAbilitySystem) (3)
        • AI (2)
        • Implement (10)
        • UI (1)
        • Error (1)
        • Network (2)
        • Tip (1)
      • Level Design (5)
      • Math (1)
      • Design Pattern (16)
      • Computer Science (2)
        • Network (1)
        • Database (1)
      • Algorithm (79)
        • Basic (4)
        • Practice (74)
      • C++ (4)
        • Basic (4)
      • Tool (0)
      • Game (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    KPT회고
    Implement
    퀘스트
    Algorithm
    DesignPattern
    c++
    Til
    Design Pattern
    사전캠프
    tsoftobjectptr
    액터
    gas
    하드 레퍼런싱
    본캠프
    게임동기화
    component
    알고리즘
    소프트 레퍼런신
    unreal
    actor
    내일배움캠프
    AI
    디자인패턴
    Animation
    basic
    assetmanager
    unrealengine
    레벨디자인
    GameplayEffect
    디자인 패턴
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
DevColIn
[UE/Basic] 직렬화 (Serialization)
상단으로

티스토리툴바