문제

정말 고맙게 생각합니다

시리얼 직렬화 라이브러리로 직렬화 해야하는 템플릿 화 된 서브 클래스가 있고, 바이스 슬래스는 비어 있으므로 기본 클래스에 Shared_PTR의 벡터를 가질 수 있으므로 템플릿 화 된 서브 클래스의 여러 유형을 유지할 수 있도록 할 수 있습니다. 효과적으로 여러 가변 유형의 벡터 저장을 허용합니다.

class NetVar_ {};
template <class VARTYPE> class NetVar : public NetVar_
{
public:
    NetVar(VARTYPE Value)
    {
        Var = Value;
    }

    template <class Archive> void serialize(Archive & archive)
    {
        archive(Var);
    }

private:
    VARTYPE Var;
};
.

바로의 다음 벡터는 몇 가지 하위 클래스 중 일부를 푸시합니다.

std::vector<std::shared_ptr<NetVar_>> PacketData;
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<std::string>>('test'));
.

마지막으로 벡터가 직렬화되어 처리를 위해 원격 시스템으로 전송됩니다.

std::ostringstream SData;
{
    cereal::PortableBinaryOutputArchive Archive(SData);
    Archive(PacketData);
    //SData is sent to remote machine here through networking library.
}
.

Puzzle에 핵심 조각이 누락되어야합니다. 프로그램이 예외를 던 졌을 때, 출력 변수의 값을 디버깅하면 비어 있거나 큰 음수 숫자가 표시되거나 기본적으로 비듬을 믿지 않도록합니다. 하위 클래스가 제대로 직렬화되지 않습니다.

코드는 문제를 노출하기 위해 단순화되었습니다. type-in-stdvector "> 여기 에이 질문에.

다음 시리얼 헤더가 포함됩니다.

#include <cereal\archives\portable_binary.hpp>
#include <cereal\types\vector.hpp>
#include <cereal\types\memory.hpp>
#include <cereal\types\string.hpp>
.

BaseClass에 더 많은 유형의 데이터를 추가하기 시작하면 더 필요할 때 더 필요할 것입니다.

누군가가 여기서 무슨 일이 일어나고 있는지 알게되면 나는 그것을 크게 감사 할 것입니다.

시간을 위해 다시 감사합니다.

도움이 되었습니까?

해결책

여기서 선택이 없습니다. 기본 클래스 인터페이스에만 액세스 할 때 다형성이 필요합니다.또한 아카이브가 템플릿 유형으로 표시됩니다.

시리얼이 SFINAE를 수행하는 것을 상상해 보면 SFINAE가 Serialize 메소드의 존재를 테스트하고 발견되지 않는 경우 기본 동작을 가질 수 있습니다.여기서는 컴파일 오류가없는 경우 여기에 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top