더북(TheBook)

이번 예제에서 마지막으로 언급할 직렬화 이슈는 바로 새로 추가된 std::vectorint32_t mMiceIndices이다. C++ 표준은 STL vector 클래스의 내부 구조를 명시하지 않는다. 따라서 나이브한 방식으로 이 필드를 다른 프로세스로 메모리 복제 전송하였을 때 안전한지 여부가 분명치 않다. 사실 대부분은 안전하지 않다고 보아야 한다. 아마도 하나 이상의 포인터가 vector 구조체 내부에 있어서 벡터에 내부의 다른 원소를 가리키고 있을 것이다. 또한, 이들 포인터 값을 바꿀 때 반드시 실행시켜 줘야 하는 코드도 있을 것이다. 따라서 vector를 단순히 복제하면 거의 100% 실패한다고 봐야 한다. 사실상 소위 블랙박스화된 대부분 데이터 구조체는 나이브하게 직렬화하는 것이 불가능하다. 구조체 내부에 무엇이 들어 있는지 명시되어 있지 않으므로 데이터를 비트 단위로 복제하는 것은 안전하지 않다. 그러므로 이렇게 복잡한 데이터 구조체를 제대로 직렬화하는 방법에 대해 계속 설명하고자 한다.

앞서 제기된 세 가지 문제점을 해결할 방법을 제시하자면, RoboCat 하나 분량의 데이터를 보내고자 할 때 각 필드를 제각기 직렬화하여 보내는 것이다. 이렇게 하면 각각을 정확하고 효율적으로 보낼 수 있다. 심지어 필드마다 패킷을 하나씩 보내는 방법도 있긴 하다. 필드의 값을 전송하는 전용의 함수를 필드마다 하나씩 만들어 호출하는 식으로 말이다. 그렇지만 이런 방식으론 패킷마다 불필요한 헤더를 무수히 전송하여 대역폭 낭비가 발생하는 데다 네트워크 연결에 부하를 주게 된다. 대신, 객체 하나를 전송할 때 그 객체와 관련된 데이터를 버퍼 하나에 모아두었다가 그 버퍼를 통째로 전송하는 게 낫다. 이제부터 설명할 스트림을 쓰면 이런 작업을 쉽게 처리할 수 있다.

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