Boost logo

Boost Users :

Subject: Re: [Boost-users] Serialization of optional<std::string>
From: Chardrazle (boost_at_[hidden])
Date: 2018-02-20 09:41:05


Indeed, and my initial workaround was to force that through:

It may be related to: https://svn.boost.org/trac10/ticket/13108
(is_default_constructible support.)

Time to start muddying the waters.
(Note: the binary archives were taken from the latest serialization 'test'
code area.)

Some test code:

#include <boost/serialization/string.hpp>
#include <boost/serialization/optional.hpp>
#include <fstream>

#if 1
#include "boost/portable_binary_iarchive.hpp"
#include "boost/portable_binary_oarchive.hpp"
typedef portable_binary_oarchive oarchive_type;
typedef portable_binary_iarchive iarchive_type;
std::ios_base::openmode flags = std::ios::binary;
#else
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
typedef boost::archive::text_oarchive oarchive_type;
typedef boost::archive::text_iarchive iarchive_type;
std::ios_base::openmode flags = std::ios_base::openmode();
#endif

#if (BOOST_VERSION >= 106400) && (__GNUC__*100 + __GNUC_MINOR__ == 406)
namespace boost { namespace serialization { namespace detail {
    template <>
    struct is_default_constructible<std::string> : boost::true_type {};
}}}
#endif

int main(int argc, char *argv[])
{
    (void)argc; (void)argv;

    {
        std::ofstream ofs("/tmp/tmp.bin", std::ios::out | flags);
        boost::optional<std::string> s = std::string("hello");
        oarchive_type oa(ofs);
        oa << s;
    }
    {
        std::ifstream ifs("/tmp/tmp.bin", std::ios::in | flags);
        boost::optional<std::string> s;
        iarchive_type ia(ifs); // # CRASH for binary #
        ia >> s;
    }
}

To work around the static_assertion, I tried adding the (serialization)
specialization for is_default_constructible<std::string>.

This then gets everything to compile, and the text_archive version doesn't
have any problems.
However, the binary_archive version crashes when trying to de-serialize.
( basic_binary_iprimitive.ipp(107): s.resize(l); )

I was concerned that the specialization has activated something undesirable,
hence my question about the correct way forward...

--
Sent from: http://boost.2283326.n4.nabble.com/Boost-Users-f2553780.html

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