더북(TheBook)

MemoryStream을 상속받은 InputMemoryStreamOutputMemoryStreamSerialize() 가상 함수를 오버라이딩하는데, 데이터를 가리키는 포인터와 데이터 크기를 인자로 받는다. 각 함수는 클래스에 따라 읽기와 쓰기를 수행하는데, 클래스의 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));
        }
    }
}

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