9
votes

Pourquoi la sérialisation lorsqu'un objet de classe en mémoire est déjà binaire (C / C ++)?

Je suppose que les données sont dispersées dans la mémoire physique (même les données d'un objet de classe sont séquentielles dans la mémoire virtuelle), afin d'envoyer les données correctement nécessaires, il doit être réassemblé et pour pouvoir envoyer le Réseau, une étape supplémentaire est la transformation de l'ordre d'octet de l'hôte à l'ordre d'octet de réseau. Est-ce correct?


1 commentaires

Juste donc nous sommes clairs sur ceci: cela n'a rien à voir avec la mémoire virtuelle contre la mémoire physique.


5 Réponses :


0
votes

classe (lorsque nous parlons de C ++) inclut également des pointeurs de méthode virtuelle - et ils doivent être reconstruits à la réception de la fin.


1 commentaires

Si vous l'avez expliqué un peu plus, vous auriez réellement raison. Une classe avec des membres virtuels contient un pointeur caché (un seul, à la méthode virtuelle Table !), Qui ne peut être correctement configuré que sur la fin de réception en appelant le constructeur de droite. Étant donné que ce pointeur est inclus dans le Tailleof de la classe, la mémorisation de la mémoire tampon l'endommagerait, de sorte que l'on doit sérialiser / désérialiser le membre-wise (il peut toujours y avoir un grand élément de podage ou même base avec les données réelles).



7
votes

Pointeurs!

Si vous avez alloué la mémoire sur le tas, vous venez de vous retrouver avec un pointeur sérialisé pointant vers une zone de mémoire arbitraire. Si vous avez juste quelques intens et caractères , vous pouvez simplement l'écrire directement dans un fichier, mais cela devient ensuite dépendant de la plate-forme en raison de la commande d'octets que vous avez mentionné. .


0 commentaires

10
votes

Une série de sérialisation appropriée peut être utilisée pour envoyer des données aux systèmes arbitraires, cela pourrait ne pas fonctionner sous la même architecture que l'hôte source.


Même un objet composé uniquement de types maternels peut être un partage gênant entre deux systèmes en raison du rembourrage supplémentaire qui pourrait exister entre et après les membres, entre autres. Partage des vidages de mémoire brutes d'objets entre les programmes compilés pour la même architecture, mais avec différentes versions de compilateur peuvent également se transformer en une grosse tracas. Il n'y a aucune garantie comment le type variable T est réellement stocké en mémoire.


Si vous ne travaillez pas avec des pointeurs (références incluses), et que les données sont censées être lues par le même binaire que celle que celle-ci est déversée, elle est généralement sûre de vider une structure crue sur le disque, mais lors de l'envoi de données à une autre Host .. la sérialisation du rouleau de tambour est la voie à suivre.

J'ai entendu des développeurs parler de NTOHL / htonl / NTOHL / NTOHS comme méthodes de sérialisation / Les entiers désériorialisants, et quand on y pense, disant que ce n'est pas si loin de la vérité.


Le mot " la sérialisation " est souvent utilisé pour décrire cette méthode compliquée " de stockage de données de manière générique ", mais encore une fois; Votre première affectation de programmation où vous avez été invitée à enregistrer des informations sur les chiens à fichier (espérons-le * ) Utilisation de la sérialisation, d'une manière ou d'une autre.

* "espérons-le" signifie que vous n'avez pas dévoilé la représentation de la mémoire brute de votre objet objet sur disque


0 commentaires

1
votes

Les représentations binaires peuvent être différentes entre différentes architectures, compilateurs et même différentes versions du même compilateur. Il ne sert à rien de garantir que le système A voit comme un entier signé sera considéré comme le même sur le système B. System B. Commande Byte, Word Langths, Cadding Silt, etc. deviendra du mal à déboguer des problèmes si vous ne définissez pas correctement le protocole ou le format de fichier pour Échanger les données.


0 commentaires

2
votes

Pointeur et Data Pack (Data Align)

Si vous MEMCY La mémoire de votre objet, il est dangereux de copier une valeur de pointeur sauvage au lieu de ses données. Il existe un autre risque, si l'expéditeur et le récepteur ont une méthode différente de données (données alignez), vous obtiendrez des ordures après décodage.


0 commentaires