2010-03-21 3 views
4

Comme nous le savons C++ est aussi un langage de programmation orienté objet où la plupart des choses sont des objets comme Java. Donc, je voulais savoir, les fonctionnalités Serialize et Deserializ sont disponibles en C++ ainsi que nous le faisons en java?Est-il possible de sérialiser et de désérialiser des objets en C++?

Si oui comment cela peut-il être réalisé?

In java Nous utilisons Serializable Interface pour dire que ce type d'objet peut être sérialisé et désérialisé.

Alors en C++ comment?

Et par curiosité est-ce la même chose dans C# que dans java?

+0

En réalité, les objets en C++ et les objets en Java ont très peu en commun. – fredoverflow

+0

Copie probable de [Comment sérialiser en C++?] (Http://stackoverflow.com/questions/234724). –

Répondre

2

Il n'y a pas fonctionnalité intégrée pour ce faire en C++. Vous devrez utiliser des bibliothèques externes, telles que Boost.

1

Vous pouvez utiliser le stockage de pile sans utiliser le nouvel opérateur, de sorte que la classe est essentiellement compressée comme une structure, puis exporter la totalité de la région de la mémoire vers le fichier. Lorsque vous le souhaitez à nouveau, allouez la région mémoire et relisez les données de classe à partir du fichier, puis accédez-y comme vous le feriez normalement. Ce ne sera pas portable, mais ça marchera. C'est très bien sur des machines comme la Nintendo DS de stocker des données de niveau lorsque vous enregistrez quelque chose en utilisant un éditeur, mais certainement pas joli (et dangereux sur des systèmes complexes, en plus!)

Note: Je ne vous recommande pas de faire ça , mais il est valide sur certaines plates-formes intégrées, comme mentionné. Je voulais juste poster quelque chose d'intéressant, que les développeurs homebrew font en C++ sur la Nintendo DS lorsqu'ils développent en utilisant palib.

+0

Je ne vais pas downvote, mais les pratiques de programmation portables Nintendo ne sont pas forcément reportées. Voulez-vous tirer plusieurs objets différents de la pile à la fois comme un glob de la mémoire? – Potatoswatter

+0

C'est un très bon système pour les jeux - par ex. cela donne de très bons temps de chargement de niveau - mais cela ne fonctionne pas vraiment pour beaucoup d'applications. – Steve314

+1

Cela ne fonctionne pas si des objets à l'intérieur de la classe ont un stockage de pile. Ce qui signifie que vous ne pouvez plus utiliser de conteneurs STL, de PIMPL, de pointeurs ou de références. – rlbond

0

Il existe plusieurs bibliothèques pour prendre en charge la sérialisation pour C++, mais c'est un travail un peu plus complexe. La sérialisation en Java dépend du fait que les objets forment un seul arbre monolithique, ce qui n'est pas du tout le cas en C++.

0

Utilisez Qt4 http://qt.nokia.com/doc/qdatastream.html fournir vos remplacements pour l'opérateur et l'opérateur < < >>

template <class KT, class VT> 
inline QDataStream &operator>>(QDataStream &in, SOMap<KT, VT> &map) { 
    QDataStream::Status oldStatus = in.status(); 
    in.resetStatus(); 
    map.clear(); 
    quint32 n; 
    in >> n; 
    for (quint32 i = 0; i < n; ++i) { 
     if (in.status() != QDataStream::Ok) 
      break; 
     KT key; 
     VT value; 
     in >> key >> value; 
     map.append(key, value); 
    } 
    if (in.status() != QDataStream::Ok) 
     map.clear(); 
    if (oldStatus != QDataStream::Ok) 
     in.setStatus(oldStatus); 
    return in; 
} 

template <class KT, class VT> 
inline QDataStream &operator<<(QDataStream &out, const SOMap<KT, VT> &map) { 
    out << quint32(map.size()); 
    for(int i = 0, c = map.size(); i < c; ++i) { 
     typename SOMap<KT, VT>::pair_type n = map.at(i); 
     out << n.first << n.second; 
    } 
    return out; 
} 
1

Java et C# prend en charge reflection. Fondamentalement, ils peuvent trouver suffisamment d'informations de l'objet/classe pour une sérialisation/désérialisation automatique significative.

Le langage C++ n'a pas reflection, par exemple vous ne pouvez pas parcourir les champs d'une classe. Vous devez donc utiliser une méthode plus ou moins manuelle. Bien sûr, il existe des bibliothèques comme Boost::serialization pour vous aider.

1

Même en Java, l'interface Serializable est juste une approche. Je donnerais une bonne considération ici à protocol buffers; il existe des implémentations Java, C++ et C# (/ .NET), and many others; vous offrant interop/portabilité en plus de la sérialisation binaire rapide et efficace.

1

généralement, vous pouvez écrire une fonction appelée serialize(), et alors quelque chose comme suit:

ofstream outFile; 
outFile.open (dirFileString.c_str(), ios::binary); 
outFile.write (reinterpret_cast < char *>(&x), 
        sizeof (x)); 
outFile.write (reinterpret_cast < char *>(&y), 
        sizeof (y)); 

et ont une fonction similaire à lire:

inFile.read (reinterpret_cast < char *>(&x), 
        sizeof (x)); 
inFile.read (reinterpret_cast < char *>(&y), 
        sizeof (y)); 

Vous pouvez faire ce genre de chose pour autant de variables dans l'objet de classe que vous avez besoin. À la vôtre.

Questions connexes