Boost logo

Boost :

Subject: [boost] [boost.serialization] Problem when serializing a wide char on version 1.58.0
From: Marco Oman (marco.oman69_at_[hidden])
Date: 2015-04-23 11:51:19


Hi to all,

I am having a problem with boost serialization on version 1.58.0
The code at the end of the post is nearly the same found at the beginning
of the page
libs/serialization/doc/index.html (the 'Very simple case'). The only
relevant difference is
the use of the wide char version of archive (and fstream) and an additional
'name' text field
in the sample structure. This text contains a cyrillic character (the
capitol 'D')

The problem I am having with this code is that it throws an exception when
using version 1.58.0,
while everything is OK if I compile/link against version 1.57.0

The problem seems to be related with character conversion: the library
seems to convert
non ascii chars to local default codepage, instead of UTF-8. So everything
looks fine as long
as I use characters convertable to my codepage. I gave a look at the
differencies between
the two versions, but they are definitely beyond my reach...

Tests done on windows with MSVC2013 and MSVC2008

  Marco

#include <fstream>

// include headers that implement a archive in simple text format
#include <boost/archive/text_woarchive.hpp>
#include <boost/archive/text_wiarchive.hpp>

/////////////////////////////////////////////////////////////
// gps coordinate
//
// illustrates serialization for a simple type
//
class gps_position
{
private:
    friend class boost::serialization::access;
    // When the class Archive corresponds to an output archive, the
    // & operator is defined similar to <<. Likewise, when the class
Archive
    // is a type of input archive the & operator is defined similar to >>.
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & degrees;
        ar & minutes;
        ar & name;
        ar & seconds;
    }
    int degrees;
    int minutes;
    std::wstring name ;
    float seconds;
public:
    gps_position(){};
    gps_position(int d, int m, float s, const std::wstring &n) :
        degrees(d), minutes(m), seconds(s), name(n)
    {}
};

int main() {
    // create and open a character archive for output
    std::wofstream ofs("filename");

    // create class instance
    const gps_position g(35, 59, 24.567f, L"AДbc");

    // save data to archive
    {
        boost::archive::text_woarchive oa(ofs);
        // write class instance to archive
        oa << g;
        // archive and stream closed when destructors are called
    }

    // ... some time later restore the class instance to its orginal state
    gps_position newg;
    {
        // create and open an archive for input
        std::wifstream ifs("filename");
        boost::archive::text_wiarchive ia(ifs);
        // read class state from archive
        ia >> newg;
        // archive and stream closed when destructors are called
    }
    return 0;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk