Serializar subclasse modelada
Pergunta
Muito obrigado pelo seu tempo, eu realmente aprecio isso
Existe uma subclasse modelada que precisa ser serializada com a Biblioteca de Serialização Cereal, a classe base está vazia, ela só existe para que possamos ter um vetor de shared_ptr para a classe base permitindo que ela contenha vários tipos da subclasse modelada, permitindo efetivamente o vetor armazenamento de vários tipos de variáveis.
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;
};
O seguinte vetor da classe base é enviado a algumas das subclasses:
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'));
Finalmente, o vetor é serializado e enviado para uma máquina remota para processamento:
std::ostringstream SData;
{
cereal::PortableBinaryOutputArchive Archive(SData);
Archive(PacketData);
//SData is sent to remote machine here through networking library.
}
Devo estar faltando uma peça-chave no quebra-cabeça, porque quando desserializo os dados, o programa lança uma exceção, se eu depurar, os valores das variáveis de saída ficam em branco ou são números negativos grandes, o que me leva a acreditar que a classe base e/ou subclasse não é sendo serializado corretamente.
O código foi simplificado para expor apenas o problema, para mais informações sobre a ideia completa você pode consultar para esta questão aqui.
Os seguintes cabeçalhos de cereais estão sendo incluídos:
#include <cereal\archives\portable_binary.hpp>
#include <cereal\types\vector.hpp>
#include <cereal\types\memory.hpp>
#include <cereal\types\string.hpp>
Tenho certeza de que precisarei de mais quando começar a adicionar mais tipos de dados à classe base.
Se alguém tiver alguma idéia do que está acontecendo aqui, eu agradeceria muito.
Mais uma vez obrigado pelo seu tempo.
Solução
Você não tem escolha aqui, o polimorfismo precisa de virtualidade quando você tem acesso apenas a uma interface de classe base.evita também que Archive seja um tipo de modelo.
Imagino que o cereal esteja fazendo algum SFINAE para testar a existência do método serialize e ter um comportamento padrão caso não seja encontrado.Esse seria o caso aqui, pois você não tem erro de compilação.