🎮Unreal4/Basic

[UE4] 직렬화 (시리얼라이제이션, Serialization)

공대 컴린이 2023. 2. 26. 23:01
728x90

💡 직렬화 

직렬화는 시리얼라이제이션(Serialization)을 한글화한 용어이다.

컴퓨터공학에서 직렬화는 현재 오브젝트의 상태를 보관하고, 이른 다른 컴퓨터 환경에서 불러와 동일한 상황으로 만들어주는 기법을 의미한다.

🚩 C++ 시프트 연산자

C++에서는 객체를 옮겨주는 직렬화 기능을 지원하지 않는다. 대신 시프트(Shift) 연산자 <<, >> 를 통해 스트림에 데이터를 전송하는 기능을 제공한다.

 

#include <iostream>

using namespace std;

int main ()
{
  int i;

  cout << "Hello, World! \n";

  cout << "Enter your number : ";

  cin >> i;

  cout << "You entered " << i;

  return 0;
}

 

데이터를 스트림에 보낼 때는 왼쪽 시프트 '<<' 연산자를 사용하고, 스트림에서 데이터를 빼올 때에는 오른쪽 시프트 '>>' 연산자를 사용한다.

 

그러나 직렬화의 개념이 성립하려면 단일 데이터를 주고받는 것이 아니라, 객체 자체를 안전하게 보내고 받을 수 있어야 한다. 그래서 C++에서는 이를 연산자 오버로딩과 friend 키워드를 사용해 객체 데이터를 주고 받는 방법을 많이 사용한다.

 

#include <iostream>

using namespace std;

class Date
{
public:
    Date(int m, int d, int y)
    {
        mo = m; da = d; yr = y;
    }

    friend ostream& operator<<(ostream& os, const Date& dt);

private:
    int mo, da, yr;
};

ostream& operator<<(ostream& os, const Date& dt)
{
    os << dt.mo << '/' << dt.da << '/' << dt.yr;

    return os;
}
 
int main()
{
    Date dt(5, 6, 92);

    cout << dt;
}

언리얼 엔진은 표준 C++ 규약을 사용하기 때문에 위와 같이 데이터 스트림으로 객체를 보내는 것이 아무런 문제가 없지만, 게임이 동작할 플랫폼에서는 cin, cout 같은 콘솔 입출력 방법을 사용하지 않는다.

게임 플랫폼에서는 디스크나 메모리 및 다양한 매체등으로 객체를 전송해야 하기 때문에, 언리얼 엔진은 멀티플랫폼에서 동작하는 FArchive 클래스를 만들어 매체의 규약을 직접 만들었다.

 

언리얼 엔진에서 파일, 메모리 등등의 데이터를 전송하는 모든 매체아카이브(Archive) 클래스인 FArchive상속받아 구현한다. 따라서 직렬화(시리얼라이제이션) 기능을 사용하려면 FArchive 클래스를 상속받아 구현하면 된다.


참조

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=destiny9720&logNo=220947856366 

 

[1-12] 시리얼라이제이션 (Serialization)

안녕하세요, 이번 시간에는 언리얼 오브젝트의 특징 중 하나인 시리얼라이제이션에 대해서 알아보겠습니다....

m.blog.naver.com

728x90