La sérialisation de l'objet de tableau d'octets en C++
Je suis en train de travailler sur un dispositif intégré (microcontrôleur), et je veux sauver les objets de mémoire permanente (EEPROM). La plupart de la sérialisation des solutions que je peux trouver, utiliser le système de fichier d'une certaine façon, mais mon objectif n'a pas de système de fichier.
Donc ma question est, comment puis-je sérialiser un objet à un tableau d'octets, donc je peux enregistrer que le tableau d'octets à une EEPROM par la suite?
Voici un exemple de ce que je suis en train de faire:
class Person{
//Constructor, getters and setters are omitted
void save(){
char buffer[sizeof(Person)];
serialize(buffer);
EEPROM::Save(buffer, sizeof(Person));
}
void load(){
char buffer[sizeof(Person)];
EEPROM::Load(buffer, sizeof(Person));
deserialize(buffer);
}
void serialize(char* result){
//?????
}
Person deserialize(char* buffer){
//??????
}
private:
char* name;
int age;
float weight;
};
le moyen le plus facile pour sérialiser des données est d'ajouter des séparateurs, mais qui dépend des données que vous souhaitez pour sérialiser. Normalement, vous devriez être capable de lire/écrire votre tampon d'octets et de stocker le même chemin dans votre EEPROM
OriginalL'auteur Jolle | 2014-10-13
Vous devez vous connecter pour publier un commentaire.
Il est probable que votre code pour
save
etload
sera raisonnablement générique et qui fonctionnent le mieux dans un autre de "gestionnaire" de la classe, laissant à chaque classe de données seulement avec la responsabilité de rendu lui-même en tant que re-chargeable:Chaque classe vous avez l'intention de sérialiser /désérialiser doit hériter d'une interface qui donne mandat à l'interface virtuelle de ces fonctions. Notez que vous aurez besoin pour faire votre propre gestion de la mémoire ici. Je vous ai donné un exemple simple, mais vous voudrez probablement quelque chose d'un peu plus robuste.
Ensuite, chaque fonction doit séquentiellement sérialiser tous les attributs de la classe (chaînage des bases de classes et de l'appel de
serialize
sur l'ensemble des objets si nécessaire.)Vous bénéficiez d'un code générique pour sérialiser /désérialiser chaque type distinct de sorte que vous ne gardez pas avoir de code à écrire la longueur des chaînes, etc. I. e. un sérialiser /désérialiser pour chaque type de POD:
D'ailleurs, vous pourriez aussi avoir besoin d'envisager ce qui va se produire si vous modifiez le schéma d'un objet dans une mise à jour du logiciel. Vos objets sauvés pourrait être endommagé sur le rechargement, à moins que vous code ronde cette aide - par exemple - une classe identificateur de version.
Dernière pensée: Au niveau micro, ce que vous faites est à bien des égards similaire à la façon dont la GOUSSE de données est sérialisé pour la transmission sur le réseau, donc peut-être que vous pouvez prendre avantage des bibliothèques, le faire - même si vous n'avez pas accès à un système d'exploitation.
NP. J'ai ajouté un peu de code d'exemple général, mais, j'avais le stress, pas testé, donc s'il vous plaît traiter avec prudence. J'espère que c'est utile pour vous.
OriginalL'auteur Component 10
Pour enregistrer une chaîne binaire, habituellement nous sauver sa longueur et son contenu. Pour enregistrer d'autres données primitifs, nous pouvons simplement pour conserver leur forme binaire. Donc dans votre cas, vous avez besoin pour stocker est:
De sorte que le code de série est:
Et de lire une chaîne de buffer binaire, vous avez bien lu sa longueur, puis copier ses données.
OriginalL'auteur liuyang