Comment mettre en œuvre la sérialisation en C++

Chaque fois que je me retrouve à avoir besoin de sérialiser des objets dans un programme C++, je revenir à ce genre de modèle:

class Serializable {
  public:
    static Serializable *deserialize(istream &is) {
        int id;
        is >> id;
        switch(id) {
          case EXAMPLE_ID:
            return new ExampleClass(is);
          //...
        }
    }

    void serialize(ostream &os) {
        os << getClassID();
        serializeMe(os);
    }

  protected:
    int getClassID()=0;
    void serializeMe(ostream &os)=0;
};

Ci-dessus fonctionne très bien dans la pratique. Cependant, j'ai entendu dire que ce genre de commutation sur les Id de classe est mal et un antipattern; ce qui est la norme, OO-façon de gérer la sérialisation en C++?

  • que les récents changements ? Je n'ai certainement pas entendu parler de tout.
  • Je veux dire cette réponse: stackoverflow.com/a/10332336/1065190
  • Ah! Je pense que la section des commentaires sur la réponse elle-même sont probablement le meilleur endroit pour en discuter. En fait, j'ai déjà commencé. Il semble assez ésotérique pour moi, surtout l'idée de la fusion de la sérialisation automatique des getters et les setters (c'est généralement mauvais pour mélanger différents concepts). Me rappelle un certain QT projet... à la fin, vous avez quasi-C++ et vous perdez la portabilité, car vous êtes dépendante de la disponibilité de l'outil qui est censé la métamorphoser en bonne, compilable en C++. Je ne suis pas en retenant mon souffle.
  • Il est bon de prendre l'a pris avec la source et simplement recompiler sur la plate-forme cible. Qt a en effet un outil appelé metaobject compilateur qui génère de la métainformation pour votre projet C++.
  • double possible de Comment sérialiser en c++?
InformationsquelleAutor Paul | 2009-11-27