더북(TheBook)

4.3.2 링킹

어떤 데이터는 하나 이상의 포인터로 여러 곳에서 참조되는 경우가 있다. 예를 들어 RoboCat 변수 중 GameObject* mHomeBase를 보자. 두 개의 RoboCat 인스턴스가 같은 기지 객체를 참조하고 있다면 지금까지 만든 코드로는 이를 표현할 방법이 아직 없다. 임베딩 기법으로는 같은 기지 객체를 두 RoboCat이 제각기 복사하여 직렬화하게 된다. 원래 하나만 있어야 할 기지 객체가 복원 시 똑같은 내용으로 두 개 만들어지고 말 것이다!8

또 다른 경우로는 데이터 구조 자체가 임베딩이 아예 불가능한 경우가 있다. 다음 HomeBase 클래스를 보자.

class HomeBase : public GameObject
{
    std::vector<RoboCat*> mRoboCats;
};

HomeBase 클래스에는 현재 활성화된 모든 RoboCat을 담는 목록이 있다. RoboCat을 임베딩 방식만 써서 직렬화하는 함수가 있다고 치자. 이 함수는 RoboCat을 직렬화하는 동안 RoboCat이 참조하는 HomeBase를 임베드해야 할 것이고, HomeBase를 임베딩하다가 모든 RoboCat을 또 임베딩해야 하는데, 이 중에는 앞서 직렬화 중이던 RoboCat도 포함되어 있을 것이다. 이런 식으로는 무한 재귀 호출로 스택 오버플로가 나기 십상이다. 그러므로 분명히 다른 솔루션이 필요하다.

 


 

8  역주 또한 매번 직렬화를 거쳐 동기화될 때마다 계속해서 그 수가 늘어나게 될 것이다!

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.