Opened 6 years ago

Closed 5 years ago

Last modified 5 years ago

#12945 closed Feature Requests (invalid)

boost::iostreams filtering streambufs only work with binary archive

Reported by: fiesh@… Owned by: Robert Ramey
Milestone: To Be Determined Component: serialization
Version: Boost 1.62.0 Severity: Problem
Keywords: Cc:

Description

Since there is no portable binary format, using the text archive and gzipping it seems convenient. However, using boost::iostream's filtering_streambuf only works with the binary archive, not the text archive, which is somewhat surprising.

#include <iostream>
#include <sstream>

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/serialization/vector.hpp>

int main()
{
        const std::vector<int> v{0, 1, 2};
        std::stringstream ss;

        {
                boost::iostreams::filtering_ostreambuf o;
                o.push(boost::iostreams::gzip_decompressor());
                o.push(ss);
                // filtering_ostreambuf isn't accepted by text_oarchive's ctor, only by binary_oarchive
                // So this doesn't work
                boost::archive::text_oarchive oa(o);
                // But this does
                // boost::archive::binary_oarchive oa(o);
                oa << v;
        }

        std::cout << ss.str() << '\n';
        return 0;
}

Change History (3)

comment:1 by Robert Ramey, 5 years ago

Indeed - it IS surprising.

And it's not toooooooo hard to fix. I'll look into it.

comment:2 by Robert Ramey, 5 years ago

Resolution: invalid
Status: newclosed

for text files use filtering_ostream rather than filtering_ostreambuf .

text files must use streams. binary files may use streams or streambuf

#include <iostream>
#include <sstream>

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/serialization/vector.hpp>

int main()
{
        const std::vector<int> v{0, 1, 2};
        std::stringstream ss;

        {
                boost::iostreams::filtering_ostream o;
                o.push(boost::iostreams::gzip_decompressor());
                o.push(ss);
                // filtering_ostreambuf isn't accepted by text_oarchive's ctor, only by binary_oarchive
                // So this doesn't work
                boost::archive::text_oarchive oa(o);
                // But this does
                // boost::archive::binary_oarchive oa(o);
                oa << v;
        }

        std::cout << ss.str() << '\n';
        return 0;
}

comment:3 by fiesh@…, 5 years ago

Oh, I'm sorry! In my defense I'd like to add I had several people look at it and they didn't see it. I guess it's confusing text archives work with both while binary ones don't, but of course that's not a bug.

Thank you!

Note: See TracTickets for help on using tickets.