An agile journey and beyond

boost::serialization und QString

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…

1 Kommentar

  1. Ich selbst

    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)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.