Serialize 템플릿 하위 클래스
문제
정말 고맙게 생각합니다
시리얼 직렬화 라이브러리로 직렬화 해야하는 템플릿 화 된 서브 클래스가 있고, 바이스 슬래스는 비어 있으므로 기본 클래스에 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 메소드의 존재를 테스트하고 발견되지 않는 경우 기본 동작을 가질 수 있습니다.여기서는 컴파일 오류가없는 경우 여기에 있습니다.