Question

Merci beaucoup pour votre temps, je l'apprécie vraiment

Il existe une sous-classe templatumée qui doit être sérialisée avec la bibliothèque de sérialisation des céréales, la base de la base est vide, elle n'existe que pour que nous puissions avoir un vecteur de Shared_Ptr à la classe de base lui permettant de contenir plusieurs types de sous-classe template, permettant de stockage vectoriel de multiples types de variables.

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;
};

Le vecteur suivant de la base de base est poussé quelques-unes des sous-classes:

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'));

Enfin, le vecteur est sérialisé et envoyé à une machine distante pour traiter:

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

Je dois manquer une pièce cline sur le puzzle car lorsque je désérialise les données que le programme jette une exception, si je débogage, les valeurs des variables de sortie sont soit des nombres négatifs vierges ou gros qui me conduit à croire la base de la base et à La sous-classe n'est pas sérialisée correctement.

Le code a été simplifié pour n'exposer que pour exposer le problème, pour plus d'informations sur l'idée complète que vous pouvez référer à cette question ici.

Les en-têtes de céréales suivantes sont inclus:

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

Je suis sûr que j'aurai besoin de plus que je commence à ajouter plus de types de données dans la base de la base.

Si quelqu'un a une idée de ce qui se passe ici, je l'apprécierais grandement.

Merci encore pour votre temps.

Était-ce utile?

La solution

Vous n'avez pas le choix ici, le polymorphisme nécessite une virtualité lorsque vous n'avez accès qu'à une interface de classe de base.Il empêche également Archiver d'être un type de modèle.

J'imagine que les céréales font de Sfinae pour tester l'existence de la méthode Serialize et avoir un comportement par défaut si non trouvé.Ce serait le cas ici car vous n'avez pas d'erreur de compilation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top