Ok, ich wollte nur mal eben bei meinem Projekt eine Klasse in ein XML dumpen und wieder einlesen. Hab ich ja mit boost::serialization
schon öfter gemacht. Leider hab ich die Klasse aber unter Qt entworfen und daher Basistypen wie QString
verwendet. Dieser hat sich allerdings zunächst geweigert…
Mit folgendem Code gings dann ganz leicht. Einziger Nachteil: es wird immer ein zusätzlicher <value>-Tag eingefügt.
// \file qstring_serialization.h
// Enables serialization of Qt QString
//
// Copyright (c) 2010 Florian Muecke. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef QSTRING_SERIALIZATION_H
#define QSTRING_SERIALIZATION_H
#include
#include
#include
#include
#include
namespace boost {
namespace serialization {
template
inline void save( Archive& ar, const QString& s, const unsigned int /*version*/ )
{
using boost::serialization::make_nvp;
ar << make_nvp("value", s.toStdString());
}
template
inline void load( Archive& ar, QString& s, const unsigned int /*version*/ )
{
using boost::serialization::make_nvp;
std::string stdStr;
ar >> make_nvp("value", stdStr);
s = QString::fromStdString(stdStr);
}
template
inline void serialize( Archive& ar, QString& s, const unsigned int file_version )
{
boost::serialization::split_free(ar, s, file_version);
}
} // namespace serialization
} // namespace boost
#endif // QSTRING_SERIALIZATION_H
Analog kann man das Ganze natürlich auch für CString
in der MFC
machen…
http://lists.boost.org/boost-users/2009/01/43759.php:
template
inline void save(Archive &ar, const Qstring & t, const unsigned int
version){
// your own code here
ar << length of qstring
ar << qstring characters
}
template
inline void load(Archive &ar, Qstring & t, const unsigned int version){
// your own code here
unsigned int l;
ar >> l;
ar << qstring characters
t = QString(l, characters);
}
BOOST_CLASS_TRACKING(QString, track_never)