J'ai une famille de classes qui contient seulement des variables des types suivants: std :: string, int, double. Je devrais être en mesure de sérialiser/désérialiser les objets de ces classes vers/à partir de la chaîne C (null terminé). Je ne veux pas utiliser un sérialiseur 3rdparty et je ne veux pas écrire un sérialiseur complet par moi-même. Je sérialiserai/désérialiser seulement une fois dans mon code. Alors, comment écrire un sérialiseur très très petit et élégant et le faire assez rapidement?Sérialiseur minuscule
MISE À JOUR
J'ai écrit et testé mon propre. Peut-être que ce sera utile pour quelqu'un. Si vous remarquez des bugs ou si vous avez des suggestions pour le rendre meilleur, faites le moi savoir. Ici, il est:
typedef std::ostringstream ostr;
typedef std::istringstream istr;
const char delimiter = '\n';
const int doublePrecision = 15;
void Save(ostr& os, int x) { os << x << delimiter; }
void Save(ostr& os, double x)
{
os.precision(doublePrecision);
os << x << delimiter;
}
void Save(ostr& os, const std::string& x) { os << x << delimiter; }
void Load(istr& is, int& x)
{
is >> x;
is.rdbuf()->sbumpc(); // get rid of delimiter
}
void Load(istr& is, double& x)
{
is >> x;
is.rdbuf()->sbumpc(); // get rid of delimiter
}
void Load(istr& is, std::string& x) { getline(is, x, delimiter); }
Test:
std::string a = "Test string 1 2 and 2.33";
std::string b = "45";
double c = 45.7;
int d = 58;
double e = 1.0/2048;
std::ostringstream os;
Save(os, a);
Save(os, b);
Save(os, c);
Save(os, d);
Save(os, e);
std::string serialized = os.str();
std::string aa;
std::string bb;
double cc = 0.0;
int dd = 0;
double ee = 0.0;
std::istringstream is(serialized);
Load(is, aa);
Load(is, bb);
Load(is, cc);
Load(is, dd);
Load(is, ee);
ASSERT(a == aa);
ASSERT(b == bb);
ASSERT(c == cc);
ASSERT(d == dd);
ASSERT(e == ee);
Qu'en est-chaînes avec « \ n » en eux? Il existe des codes ascii spécifiques pour la fin du groupe/enregistrement/bloc, etc. qui ne sont pas susceptibles d'apparaître dans une chaîne. –