|
Boost : |
From: Robert Ramey (ramey_at_[hidden])
Date: 2006-02-09 10:08:48
No such checking is built in. If you really need this it would have to be
done
by making a derivation from an existing archive.
Robert Ramey
Oliver.Kowalke_at_[hidden] wrote:
>> Oliver.Kowalke_at_[hidden] wrote:
>>> Hello,
>>> is it possible to prevent that the archive of class X can be
>>> restored in class Y (both have the same layout)?
>
>> I don't understand what this means.
>> Robert Ramey
>
> I don't want Y created from a archive containing a X.
> Please look at the code below:
>
> #include <iostream>
> #include <sstream>
> #include <stdexcept>
>
> #include <boost/archive/text_oarchive.hpp>
> #include <boost/archive/text_iarchive.hpp>
> #include <boost/archive/xml_iarchive.hpp>
> #include <boost/archive/xml_oarchive.hpp>
> #include <boost/serialization/nvp.hpp>
> #include <boost/serialization/level.hpp>
> #include <boost/serialization/export.hpp>
>
> class X
> {
> public:
> friend class boost::serialization::access;
>
> template< typename Archive >
> void serialize( Archive & ar, unsigned int version)
> {
> ar & BOOST_SERIALIZATION_NVP( degrees);
> ar & BOOST_SERIALIZATION_NVP( city);
> }
>
> int degrees;
> std::string city;
>
> X(){};
>
> X( int d, std::string const& c)
>> degrees( d), city( c)
> {}
> };
>
> // BOOST_CLASS_EXPORT(X)
> // BOOST_CLASS_IMPLEMENTATION(X,
> boost::serialization::object_class_info)
>
> class Y
> {
> public:
> friend class boost::serialization::access;
>
> template< typename Archive >
> void serialize( Archive & ar, unsigned int version)
> {
> ar & BOOST_SERIALIZATION_NVP( degrees);
> ar & BOOST_SERIALIZATION_NVP( city);
> }
>
> int degrees;
> std::string city;
>
> Y(){};
>
> Y( int d, std::string const& c)
>> degrees( d), city( c)
> {}
> };
>
> // BOOST_CLASS_EXPORT(Y)
> // BOOST_CLASS_IMPLEMENTATION(Y,
> boost::serialization::object_class_info)
>
> int main()
> {
> try
> {
> std::stringstream ss;
>
> int degrees = -1342;
> std::string city;
>
> city += "abc";
>
> {
> boost::archive::text_oarchive oa( ss);
>
> const X g( degrees, city);
>
> oa << g;
> }
>
> std::cout << ss.str() << std::endl;
>
> {
> boost::archive::text_iarchive ia( ss);
>
> Y g;
>
> ia >> g; // I would expect an exception; at
> least not Y rtestored
>
> if ( g.degrees == degrees && g.city == city)
> std::cout << "equal" << std::endl;
> else
> std::cout << "not equal" << std::endl;
> }
>
> return 0;
> }
> catch ( std::exception const& e)
> { std::cerr << e.what() << std::endl; }
> catch (...)
> { std::cerr << "unhandled" << std::endl; }
>
> return -1;
> }
>
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk