sérialisation vectorielle

J’essaye de sérialiser binary les données du vecteur. Dans l’exemple ci-dessous, je sérialise en chaîne, puis je désérialise en vecteur, mais je n’obtiens pas les mêmes données que celles avec lesquelles j’ai commencé. pourquoi est-ce le cas?

vector v; v.push_back(1); v.push_back(2); v.push_back(3); ssortingng s((char*)(&v[0]), 3 * sizeof(size_t)); vector w(3); strncpy((char*)(&w[0]), s.c_str(), 3 * sizeof(size_t)); for (size_t i = 0; i < w.size(); ++i) { cout << w[i] << endl; } 

Je m’attends à obtenir la sortie

 1 2 3 

mais au lieu d’obtenir la sortie

 1 0 0 

(sur gcc-4.5.1 )

L’erreur est dans l’appel à strncpy . De la page liée:

Si la longueur de src est inférieure à n , strncpy () complète le rest de dest avec des octets nuls.

Ainsi, après avoir trouvé le premier 0 octet dans les données sérialisées, le rest du tableau de données de w est rempli avec 0 s.

Pour résoudre ce problème, utilisez une boucle for ou std::copy

 std::copy( &s[0], &s[0] + v.size() * sizeof(size_t), reinterpret_cast(w.data()) ); 

IMO, au lieu d’utiliser std::ssortingng tant que tampon, utilisez simplement un tableau de caractères pour contenir les données sérialisées.

Exemple sur ideone

strncpy est un énorme tas d’échec. Il se terminera tôt dans votre entrée car size_t a des octets de zéro, qu’il interprète comme étant le terminateur NULL, en les laissant comme un 0 construit par défaut. Si vous avez exécuté ce test sur une machine BE, tous seraient 0. Utilisez std::copy .

Pour sérialiser ce vecteur en chaîne, vous souhaitez d’abord convertir chacun des éléments de ce vecteur d’un entier en une chaîne contenant la même représentation ascii de ce nombre. Cette opération peut être appelée sérialisation d’un entier en chaîne.

Ainsi, par exemple, en supposant qu’un entier est 10 chiffres, nous pouvons

 // create temporary ssortingng to hold each element char intAsSsortingng[10 + 1]; 

puis convertit l’entier en chaîne

 sprintf(intAsSsortingng, "%d", v[0]); 

ou

 itoa( v[0], intAsSsortingng, 10 /*decimal number*/ ); 

Vous pouvez également utiliser ossortingngstream et l’opérateur <<

si vous regardez le contenu de la mémoire de intAsSsortingng et v [0], ils sont très différents, le premier contient les lettres ascii qui représentent la valeur de v [0] dans le système de nombres décimaux (base 10), tandis que v [0] contient la représentation binary du nombre (car c’est ainsi que les ordinateurs stockent les nombres).

Le moyen le plus sûr serait simplement de parcourir le vecteur et de stocker les valeurs individuellement dans un tableau de caractères de taille 3 * sizeof (size_t). De cette façon, vous n’aurez aucune dépendance vis-à-vis de la structure interne de l’implémentation de la classe de vecteurs.