Boost logo

Boost Users :

From: kila suelika (semeegozy_at_[hidden])
Date: 2022-11-04 02:47:19


I write an example where one can manually set pointer in load:

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <sstream>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <map>
#include <string>

#include <boost/serialization/split_member.hpp>

std::map<std::string, int> m{ {"x",5} };
struct A
{
friend class boost::serialization::access;
int* x;

template <class Archive>
void save(Archive& ar, const unsigned int version) const {

}
template <class Archive>
void load(Archive& ar, const unsigned int version) {
x = &(::m["x"]);//Access outside data.
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
};

int main()
{
A a;

std::stringstream s;
boost::archive::binary_oarchive oa(s);
oa << a;

boost::archive::binary_iarchive ia(s);
A a0;
ia >> a0;

std::cout << *(a0.x) << std::endl;
}

On Fri, Nov 4, 2022 at 7:20 AM Gavin Lambert via Boost-users <
boost-users_at_[hidden]> wrote:

> On 3/11/2022 20:40, Markus Lavin wrote:
> > If a serialized object in the dynamic part contains a pointer to a
> > non-seralized object in the static part then how do I deal with that.
> > Clearly the address cannot be serialized since it may change between
> > builds and even between runs (ASLR). The program does contain a
> > 'registry' though where all relevant static objects are registered with
> > a unique identifier.
> >
> > So question is would it somehow be possible to have Boost serialization
> > use this registry to serialize the unique identifier instead of trying
> > to serialize the entire object when one of those pointers are serialized?
>
> Each class can choose exactly what data it serializes and deserializes,
> and what it does with it.
>
> For this case it sounds like you probably want
>
> https://www.boost.org/doc/libs/1_80_0/libs/serialization/doc/tutorial.html#splitting
> such that you can save an internal id and then reload that id and look
> up the corresponding pointer, rather than serializing the other object
> directly. You can still cascade into the other object as a reference to
> save/load its dynamic state after that.
>
> You will likely also want to read about
>
> https://www.boost.org/doc/libs/1_80_0/libs/serialization/doc/special.html#objecttracking
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> https://lists.boost.org/mailman/listinfo.cgi/boost-users
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net