#include #include #include #include #include #include struct I { virtual void m() = 0; template void serialize(Archive& ar, int) { } }; struct J { virtual void m() = 0; template void serialize(Archive& ar, int) { } }; struct D; struct C { int v; I* i; J* j; D* d; template void serialize(Archive& ar, int) { ar & v & i & j & d; } }; struct D { int v; J* j; C* c; template void serialize(Archive& ar, int) { ar & v & j & c; } }; struct E : C, I { E(int) { i = this; } void m() { } template void serialize(Archive& ar, int) { ar & boost::serialization::base_object(*this) & boost::serialization::base_object(*this); } }; struct A { A(int foo) : e(foo) { } void m(); int v; E e; template void serialize(Archive& ar, int) { ar & v & e; } }; struct B : J { B(int) { d.j = this; } void m() { } int v; D d; template void serialize(Archive& ar, int) { ar & boost::serialization::base_object(*this) & v & d; } }; struct T { T(int foo) : a(foo), b(foo) { a.e.j = &b; a.e.d = &b.d; b.d.c = &a.e; } A a; B b; template void serialize(Archive& ar, int) { ar & a & b; } }; template void store(const T& v) { std::ofstream ofs("filename"); boost::archive::binary_oarchive oa(ofs); oa << v; } int main(int, char**) { T t(0); store(t); return 0; }