| 1 | #include <fstream>
|
|---|
| 2 | #include <boost/archive/xml_oarchive.hpp>
|
|---|
| 3 | #include <boost/archive/xml_iarchive.hpp>
|
|---|
| 4 | #include <boost/serialization/nvp.hpp>
|
|---|
| 5 |
|
|---|
| 6 | struct MyInt {
|
|---|
| 7 | MyInt():i_(0) {}
|
|---|
| 8 | MyInt(int i):i_(i) {}
|
|---|
| 9 | int i_;
|
|---|
| 10 | friend class boost::serialization::access;
|
|---|
| 11 | template<class Archive>
|
|---|
| 12 | void serialize(Archive &ar, unsigned int const /* file_version */)
|
|---|
| 13 | {
|
|---|
| 14 | ar & BOOST_SERIALIZATION_NVP(i_);
|
|---|
| 15 | }
|
|---|
| 16 | };
|
|---|
| 17 |
|
|---|
| 18 | struct Foo {
|
|---|
| 19 | MyInt& ref_;
|
|---|
| 20 |
|
|---|
| 21 | Foo(MyInt& ref):ref_(ref) {}
|
|---|
| 22 |
|
|---|
| 23 | friend class boost::serialization::access;
|
|---|
| 24 |
|
|---|
| 25 | template<class Archive>
|
|---|
| 26 | void serialize(Archive &ar, unsigned int const /* file_version */) {}
|
|---|
| 27 |
|
|---|
| 28 | template<class Archive>
|
|---|
| 29 | friend void save_construct_data(Archive& ar,
|
|---|
| 30 | Foo const* p, unsigned int const /* file_version */);
|
|---|
| 31 |
|
|---|
| 32 | template<class Archive>
|
|---|
| 33 | void load_construct_data(Archive& ar,
|
|---|
| 34 | Foo* p, unsigned int const /* file_version */);
|
|---|
| 35 | };
|
|---|
| 36 |
|
|---|
| 37 | template<class Archive>
|
|---|
| 38 | void save_construct_data(Archive& ar, Foo const* p, unsigned int const /* file_version */)
|
|---|
| 39 | {
|
|---|
| 40 | #if 0
|
|---|
| 41 | // OK
|
|---|
| 42 | MyInt* pRef = &p->ref_;
|
|---|
| 43 | ar << boost::serialization::make_nvp("ref_", pRef);
|
|---|
| 44 | #else
|
|---|
| 45 | // Error
|
|---|
| 46 | ar << boost::serialization::make_nvp("ref_", &p->ref_);
|
|---|
| 47 | #endif
|
|---|
| 48 | }
|
|---|
| 49 |
|
|---|
| 50 | template<class Archive>
|
|---|
| 51 | void load_construct_data(Archive & ar, Foo* p, unsigned int const /* file_version */)
|
|---|
| 52 | {
|
|---|
| 53 | MyInt* pRef;
|
|---|
| 54 | ar >> boost::serialization::make_nvp("ref_", pRef);
|
|---|
| 55 | ::new(p) Foo(*pRef);
|
|---|
| 56 | }
|
|---|
| 57 |
|
|---|
| 58 | struct Bar {
|
|---|
| 59 | Bar():mi_(1) {}
|
|---|
| 60 | MyInt mi_;
|
|---|
| 61 | Foo* pFoo_;
|
|---|
| 62 |
|
|---|
| 63 | friend class boost::serialization::access;
|
|---|
| 64 | template<class Archive>
|
|---|
| 65 | void serialize(Archive &ar, unsigned int const /* file_version */)
|
|---|
| 66 | {
|
|---|
| 67 | ar & BOOST_SERIALIZATION_NVP(mi_);
|
|---|
| 68 | ar & BOOST_SERIALIZATION_NVP(pFoo_);
|
|---|
| 69 | }
|
|---|
| 70 | };
|
|---|
| 71 |
|
|---|
| 72 | int main()
|
|---|
| 73 | {
|
|---|
| 74 | {
|
|---|
| 75 | std::ofstream ofs("ref.xml");
|
|---|
| 76 | Bar b1;
|
|---|
| 77 | b1.pFoo_ = new Foo (b1.mi_);
|
|---|
| 78 | b1.pFoo_->ref_.i_ = 2;
|
|---|
| 79 | assert(b1.mi_.i_ == 2);
|
|---|
| 80 | boost::archive::xml_oarchive oa(ofs);
|
|---|
| 81 | oa << BOOST_SERIALIZATION_NVP(b1);
|
|---|
| 82 | delete b1.pFoo_;
|
|---|
| 83 | }
|
|---|
| 84 | {
|
|---|
| 85 | std::ifstream ifs("ref.xml");
|
|---|
| 86 | boost::archive::xml_iarchive ia(ifs);
|
|---|
| 87 | Bar b2;
|
|---|
| 88 | ia >> BOOST_SERIALIZATION_NVP(b2);
|
|---|
| 89 | assert(b2.mi_.i_ == 2);
|
|---|
| 90 | assert(b2.pFoo_->ref_.i_ == 2);
|
|---|
| 91 | b2.mi_.i_ = 3;
|
|---|
| 92 | assert(b2.pFoo_->ref_.i_ == 3);
|
|---|
| 93 | }
|
|---|
| 94 | }
|
|---|