예제 시나리오에서 수신자의 RoboCat 생성자는 객체의 초기 상태로 mHealth는 10, mMeowCount는 3으로 초기화했다. 게임 플레이 도중 여러 과정을 통해 송신자가 RoboCat의 ‘냐옹’을 한 번 발사하고, 체력은 절반 잃어버렸다 치자. mHealth와 mMeowCount는 원시 자료형이므로, 나이브한 송수신 방식으로도 무리 없이 잘 동작한다. 이에 따라 수신자의 최종값은 송신자의 변경된 값과 같게끔 갱신된다.
▼ 표 4-1 메모리상 샘플 RoboCat 데이터의 변화
주소 |
필드 |
원본값 |
대상 초깃값 |
대상 최종값 |
바이트 0-3 |
mHealth |
0x00000005 |
0x0000000A |
0x00000005 |
바이트 4-7 |
mMeowCount |
0x00000002 |
0x00000003 |
0x00000002 |
그러나 본격적으로 게임을 개발하다 보면, 핵심 데이터 요소들을 표 4-1의 RoboCat과 같이 간단히 표현할 수 있는 경우는 그다지 많지 않다. 다음과 같이 RoboCat 코드가 추가 개발되면, 더 이상 메모리 레이아웃에 의존하는 단순한 방식으로는 제대로 전송이 되지 않으므로 더욱 견고한 직렬화 시스템이 필요하게 된다.
class RoboCat : public GameObject { public: RoboCat() : mHealth(10), mMeowCount(3), mHomeBase(0) { mName[0] = ‘\0’; } virtual void Update(); void Write(OutputMemoryStream& inStream) const; void Read(InputMemoryStream& inStream); private: int32_t mHealth; int32_t mMeowCount; GameObject* mHomeBase; char mName[128]; std::vector<int32_t> mMiceIndices; };