[Boost-bugs] [Boost C++ Libraries] #1086: Serialization of weak_ptr produces invalid XML

Subject: [Boost-bugs] [Boost C++ Libraries] #1086: Serialization of weak_ptr produces invalid XML
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2007-07-11 12:21:45


#1086: Serialization of weak_ptr produces invalid XML
---------------------------+------------------------------------------------
 Reporter: anonymous | Type: Bugs
   Status: new | Milestone: To Be Determined
Component: serialization | Version:
 Severity: Problem | Keywords:
---------------------------+------------------------------------------------
 Hello, there seems to be a problem with serialization of weak_ptr.

 The second example below produces invalid XML where the same attributes
 appears two times with different values. It appears that both save and
 load using boost::serialization works, but other tools complains about the
 XML being invalid. We don't know if this is a problem in
 Boost.Serialization or in Boost.Archive

 The example has been tested using Boost 1.33.1 in Visual Studio 2005. We
 have not tested using Boost 1.34.0 yet.

 Anders Edin, Sidec Technologies AB

 -------------------------------------------------------------------------

 {{{

 #include <iostream>

 #include <boost/shared_ptr.hpp>
 #include <boost/weak_ptr.hpp>

 #include <boost/archive/xml_oarchive.hpp>
 #include <boost/serialization/access.hpp>
 #include <boost/serialization/version.hpp>
 #include <boost/serialization/base_object.hpp>
 #include <boost/serialization/shared_ptr.hpp>
 #include <boost/serialization/weak_ptr.hpp>

 class A
 {
 public:
     A() {}
     virtual ~A() {}

     virtual void set_self(boost::shared_ptr<A> s)
     {
         self_ = s;
     }

     virtual boost::shared_ptr<A> get_self() const
     {
         return self_.lock();
     }

 private:
     friend boost::serialization::access;
     template <typename Archive>
     void serialize(Archive& archive, const unsigned int file_version)
     {
         archive & boost::serialization::make_nvp("self_", self_);
     }

     boost::weak_ptr<A> self_;
 };

 BOOST_CLASS_VERSION(A, 1);

 class B: public A
 {
 public:
     B(): value_(3) {}
     virtual ~B() {}

 private:
     friend boost::serialization::access;
     template <typename Archive>
     void serialize(Archive& archive, const unsigned int file_version)
     {
         archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);
         archive & boost::serialization::make_nvp("value_", value_);
     }

     int value_;
 };

 BOOST_CLASS_VERSION(B, 1);

 int main(int argc, char* argv[])
 {
     // This test object points to itself
     boost::shared_ptr<A> a(new A());
     a->set_self(a);

     // This test object also points to itself, but by pointing to its base
 class
     boost::shared_ptr<B> b(new B());
     b->set_self(b);

     // First example
     {
         boost::archive::xml_oarchive archive(std::cout);
         archive << boost::serialization::make_nvp("A", a);
     }

     std::cout<<std::endl;

     // Second example
     {
         boost::archive::xml_oarchive archive(std::cout);
         archive << boost::serialization::make_nvp("B", b);
     }

     return 0;
 }

 /* Output from running the program in Visual Studio 2005

 -- The first example works as expected

 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <!DOCTYPE boost_serialization>
 <boost_serialization signature="serialization::archive" version="3">
   <A class_id="0" tracking_level="0" version="1">
     <px class_id="1" tracking_level="1" version="1" object_id="_0">
       <self_ class_id="2" tracking_level="0" version="0">
         <px class_id_reference="1" object_id_reference="_0"></px>
       </self_>
     </px>
   </A>
 </boost_serialization>

 -- The second example produces invalid XML with attributes having two
 values in self_

 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <!DOCTYPE boost_serialization>
 <boost_serialization signature="serialization::archive" version="3">
   <B class_id="0" tracking_level="0" version="1">
     <px class_id="1" tracking_level="1" version="1" object_id="_0">
       <A class_id="2" tracking_level="1" version="1" object_id="_1">
         <self_ class_id="3" tracking_level="0" version="0" class_id="4"
 tracking_level="0" version="1">
           <px class_id_reference="1" object_id_reference="_0"></px>
         </self_>
       </A>
       <value_>3</value_>
     </px>
   </B>
 </boost_serialization>

 */
 }}}

--
Ticket URL: <http://svn.boost.org/trac/boost/ticket/1086>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.


This archive was generated by hypermail 2.1.7 : 2017-02-16 18:49:56 UTC