MemoryStream을 상속받은 InputMemoryStream과 OutputMemoryStream은 Serialize() 가상 함수를 오버라이딩하는데, 데이터를 가리키는 포인터와 데이터 크기를 인자로 받는다. 각 함수는 클래스에 따라 읽기와 쓰기를 수행하는데, 클래스의 IsInput() 역시 오버라이딩하여 스트림이 읽기용인지 쓰기용인지 구분해 준다. 하위 클래스의 가상 함수를 각각 잘 오버라이딩해 두고, 상위 클래스 MemoryStream에 템플릿 버전 Serialize()를 다음과 같이 추가한다.
template<typename T> void Serialize(T& ioData) { static_assert( std::is_arithmetic<T>::value || std::is_enum<T>::value, “Generic Serialize only supports primitive data types”); if (STREAM_ENDIANNESS == PLATFORM_ENDIANNESS) Serialize(&ioData, sizeof(ioData)); else { if (IsInput()) { T data; Serialize(&data, sizeof(T)); ioData = ByteSwap(data); } else { T swappedData = ByteSwap(ioData); Serialize(&swappedData, sizeof(swappedData)); } } }