Boost logo

Boost Users :

From: Markus Werle (numerical.simulation_at_[hidden])
Date: 2006-10-19 05:00:09


Robert Ramey <ramey <at> rrsd.com> writes:

>
> Markus Werle wrote:
> > Robert Ramey <ramey <at> rrsd.com> writes:
>
> >> The easiest would be just to define non-untrusive serialize
> >> templates for these classes.
> >
> > Unfortunately this approach still requires an extra nvp for xml
> > files, so for the code below we obtain e.g.
> >
> > <SomeTag><value>SomeText</value><SomeTag>
> >
> > The extra tag is what I would like to avoid.
>
> Note that usage of std::string rather than CString will
> have the same "extra" tag.

I disagree. Probably I did not explain my intention/problem precise enough.
To store a std::string in an xml file you need 1 tag, not 2 like for CString.
You store it by using

std::string myStdString = "Test";
[...]
ar & make_nvp("SomeTag", myStdString);

and obtain an xml file with a line

<SomeTag>Test<SomeTag>

which is exactly what I want. But now I want this for any
type which has a string representation, e.g. CString from MFC
(the lib I hate most)

As I showed in a previous post the classical approach, which you
also mention in modified form bails out due to missing _extra_ nvp!
Compiler fails on

template<class Archive>
inline void save(Archive & ar,
                CString const & S,
                unsigned int const /* file_version */)
{
        using boost::serialization::make_nvp;
        std::string const s(S);
        
        ar << s;
}
with [...]basic_xml_oarchive.hpp(86) : error C2027: use of undefined type
'boost::STATIC_ASSERTION_FAILURE<> etc.

even if you store the CString using an nvp like in

CString myStdString = "Test";
[...]
ar & make_nvp("SomeTag", myStdString);

So there is an unnecessary (?) asymmetry between CString and std::string.

> what's the matter with adding to MyType a common string cast operator
>
> and using:
>
> template<class Archive>
> void save(Archive &ar, const MyType &t, const unsigned version){
> std::string s = t;
> ar << t;
> }
> and
>
> std::ostream & operator<<(std::ostream &os, MyType const & T){
> std::string s = t;
> *this << t;
> }

This is what I tried with CString. My approach yields an xml file
with a line containing
<SomeTag><value>Test</value><SomeTag>

using

template<class Archive>
inline void save(Archive & ar,
                 CString const & S,
         unsigned int const /* file_version */)
{
        using boost::serialization::make_nvp;
        std::string const s(S);
        
        ar << make_nvp("value", s);
}

I still cannot see how to avoid this extra <value> tag.
Did it become clear now?

Markus


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net