언리얼 엔진 직렬화

2026. 10. 1. 12:48·Unreal

직렬화(Serialization) 란?

  • 오브젝트나 연결된 오브젝트의 묶음(오브젝트 그래프)을 바이트 스트림으로 변환하는 과정
    • 복잡한 데이터를 일렬로 세우기 때문에 직렬화
  • 역직렬화로 변환된 데이터를 복원할 수 있
    • Serialization : 오브젝트 그래프에서 바이트 스트림으로 -> 객체의 데이터를 저장, 전달할 수 있게 변환
    • Deserialization : 바이트 스트림에서 오브젝트 그래프로 -> 저장, 전달된 표현을 해석해 객체 상태 복원
  • 직렬화가 가지는 장점
    • 현재 상태를 저장하고, 복원가능 (게임저장)
    • 현재 객체의 정보를 클립보드에서 복사 후 전송가능
    • 네트워크를 통해 현재 상태를 다른 컴퓨터에 복원 가능 (멀티 게임)
    • 데이터 압축, 암호화를 통해 데이터를 효율적이고 안전하게 보관

직렬화 구현 시 고려할 점

  • 데이터 레이아웃 : 오브젝트가 소유한 다양한 데이터를 변환할거임?
  • 이식성 : 서로 다른 시스템에 전송해도 이식가능?
  • 버전 관리 : 새로운 기능이 추가될 때 어떻게 확장하고 처리할거임?
  • 성능 : 네트워크 비용을 줄이기 위해 어떤 데이터 형식 사용?
  • 보안 : 데이터를 어떻게 보호?
  • 에러 처리 : 전송 과정에서 문제 발생할 경우, 어떻게 인식하고 처리?

언리얼 엔진 직렬화 시스템

  • 위의 사항들을 모두 고려한 직렬화 시스템을 제공
  • 아카이브 클래스 (FArchive)
    • 메모리 아카이브 (FMemoryReader, FMemoryWriter)
    • 파일 아카이브(FArchiveFileReaderGeneric, FArchiveFileWriterGeneric)
    • 기타 언리얼 오브젝트와 관련된 아카이브 클래스 (FArchiveUObject)
  • Shift << operator : 직렬화를 위해 오버로딩한 << 연산자
  • Json 직렬화 기능
  1. 일반 C++ 구조체의 데이터를 바이너리 파일에 저장하고, 다시 읽어서 복원하는 직렬화
    구조체와 직렬화 규칙
struct FStudentData  
{   
FStudentData(){}  
FStudentData(int32 InOrder, const FString& InName) : Order(InOrder), Name(InName) {}

// shift operator를 직접 지정  
friend FArchive& operator<< (FArchive& Ar, FStudentData& InStudentData)  
{  
// 레이아웃 지정  
Ar << InStudentData.Order;  
Ar << InStudentData.Name;

return Ar;
}

int32 Order = -1;  
FString Name = TEXT("홍길동");  
};
  • FStudentData를 FArchive로 처리할 수 있도록 << 연산자를 오버로딩
  • 저장용 Ar : 멤버 값을 아카이브에 기록
  • 읽기용 Ar : 아카이브에서 읽은 값으로 멤버 덮음
  • 읽을 때 값이 바뀌어서 InStudentData은 const 말고 참조로 받음
  • 직렬화 순서는 Order -> Name 으로 읽을 때 같은 순서로 처리

아카이브(Archive) 란?

데이터를 파일, 메모리, 네트워크 등 다양한 매체에서 읽고 쓰기위해 사용하는 인터페이스
구조체의 직렬화 규칙은 유지하면서 데이터를 처리하는 대상을 바꿀 수 있게 해줌

  • 언리얼에선 FArchive가 기본 클래스

직렬화 규칙 : 어떤 데이터를 어떤 순서로 처리할지 정의, FStudentData에서의 operator<<

friend FArchive& operator<< (FArchive& Ar, FStudentData& InStudentData)  
{  
// 레이아웃 지정  
Ar << InStudentData.Order;  
Ar << InStudentData.Name;
return Ar;
}

<< 는 아카이브에 따라 동작이 달라짐

UObject

UObject 클래스에 Serialize() 가상함수가 선언되어 있음

virtual void Serialize(FArchive& Ar);

UObject를 상속받으면 오버라이드해서 직렬화 처리 추가 가능

virtual void Serialize(FArchive& Ar) override;

UObject::Serialize(FArchive& Ar) - 객체의 데이터를 아카이브로 처리
FArchive::Serialize(void* V, int64 Length) - 지정된 메모리 영역의 바이트를 처리 (더 아래 단계)

아카이브와 스마트포인터

TUniquePtr Writer; - 아카이브 객체의 소유권과 수명관리
*Writer << Data; - 데이터 직렬화
Writer->Close(); - 파일 아카이브의 닫기, 마무리 처리

TUniquePtr : 지정한 곳에서만 메모리를 관리하는 포인터

  • 단독 소유, 소멸하거나 Reset() 할 때 소유 객체 삭제, 복사 불가, 소유권 이동가능
  • 특정 오브젝트에게 명확하게 포인터 해지 권한을 주고 싶은 경우
  • delete 구문 없이 함수 실행 후 자동으로 소멸시키고 싶을 때
  • Null 가능

    TSharedPtr : 더 이상 사용되지 않으면 자동으로 메모리 해지하는 포인터

  • 공유 소유, 마지막 소유자가 사라질 때 객체 삭제
  • 여러 로직에서 할당된 오브젝트가 공유해서 사용되는 경우
  • 다른 함수로부터 할당된 오브젝트를 Out으로 받는 경우
  • Null 가능

    TSharedRef : 공유포인터와 동일하지만, 유효한 객체를 항상 보장받는 레퍼런스

  • 여러 로직에서 할당된 오브젝트가 공유해서 사용되는 경우
  • Not Null 보장, 오브젝트를 편하게 사용할 수 있음

Student.h

UCLASS()
class UNREALSERIALIZATION_API UStudent : public UObject
{
    GENERATED_BODY()

public:
    UStudent();

    int32 GetOrder() const { return Order; }
    void SetOrder(int32 InOrder) { Order = InOrder; }

    const FString& GetName() const { return Name; }
    void SetName(const FString& InName) { Name = InName; }

    virtual void Serialize(FArchive& Ar) override;
private:
    UPROPERTY()
    int32 Order;

    UPROPERTY()
    FString Name;
};

Student.cpp

#include "Student.h"

UStudent::UStudent()
{
    Order = -1;
    Name = TEXT(" 홍길동");
}

void UStudent::Serialize(FArchive& Ar)
{
    Super::Serialize(Ar);

    Ar << Order;
    Ar << Name;
}

MyGameInstance.h


struct FStudentData
{
    FStudentData(){}
    FStudentData(int32 InOrder, const FString& InName) : Order(InOrder), Name(InName) {}

    // shift operator를 직접 지정
    friend FArchive& operator<< (FArchive& Ar, FStudentData& InStudentData)
    {
        // 레이아웃 지정
        Ar << InStudentData.Order;
        Ar << InStudentData.Name;

        return Ar;
    }

    int32 Order = -1;
    FString Name = TEXT("홍길동");
};

UCLASS()
class UNREALSERIALIZATION_API UMyGameInstance : public UGameInstance
{
    GENERATED_BODY()

public:
    UMyGameInstance();

    virtual void Init() override;

private:
    UPROPERTY()
    TObjectPtr<class UStudent> StudentSrc;
};

MyGameInstance.cpp

void UMyGameInstance::Init()
{
    Super::Init();
    StudentSrc = NewObject<UStudent>();
    StudentSrc->SetName(TEXT("룰루루"));
    StudentSrc->SetOrder(11);

    {
        const FString ObjectDataFileName(TEXT("ObjectData.bin"));
        FString ObjectDataAbsolutPath = FPaths::Combine(*SaveDir, *ObjectDataFileName);
        FPaths::MakeStandardFilename(ObjectDataAbsolutPath);

        TArray<uint8> BufferArray;
        FMemoryWriter MemoryWriterAr(BufferArray);
        StudentSrc->Serialize(MemoryWriterAr);

        // 이번에는 스마트포인터를 사용해서 가지고올거임
        if (TUniquePtr<FArchive> FileWriterAr= TUniquePtr<FArchive>(IFileManager::Get().CreateFileWriter(*ObjectDataAbsolutPath)))
        {
            *FileWriterAr << BufferArray; // shift 연산
            FileWriterAr->Close();
        }

        TArray<uint32> BufferArrayFromFile;
        if (TUniquePtr<FArchive> FileReaderAr = TUniquePtr<FArchive>            (IFileManager::Get().CreateFileWriter(*ObjectDataAbsolutPath)))
        {
            *FileReaderAr << BufferArrayFromFile; // shift 연산
            FileReaderAr->Close();
        }
    }
저작자표시 (새창열림)

'Unreal' 카테고리의 다른 글

[Unreal Blueprint] 머티리얼 피격 효과  (0) 2026.09.23
[Unreal Blueprint] 공격  (0) 2026.09.21
[Unreal Blueprint] 카메라 매니저  (0) 2026.09.21
애니메이션 블루프린트 링크  (0) 2026.09.17
게임 플레이 입력 처리  (0) 2026.09.15
'Unreal' 카테고리의 다른 글
  • [Unreal Blueprint] 머티리얼 피격 효과
  • [Unreal Blueprint] 공격
  • [Unreal Blueprint] 카메라 매니저
  • 애니메이션 블루프린트 링크
야챔
야챔
  • 야챔
    월월왈왈
    야챔
  • 전체
    오늘
    어제
    • 전체보기
      • 일지
      • C++
      • Unreal
      • 자료구조
      • 코테연습
      • 알고리즘
        • 백준
        • 프로그래머스
      • 기타
        • Python
        • JavaScript
        • C#
        • MySQL
        • Docker
        • Review
        • RP
        • -----
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    라이징 프로그래머 2기
    정렬
    백준
    Review
    Level2
    Git
    c#
    Python
    프로그래머스
    알고리즘
    node.js
    탐색
    level1
    unreal
    개념
    MySQL
    docker
    메이커스 6기
    예제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
야챔
언리얼 엔진 직렬화
상단으로

티스토리툴바