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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top