Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::serialization - Non intrusive serialization of user-defined members?
From: Richard Hodges (hodges.r_at_[hidden])
Date: 2018-03-05 16:47:12


non-intrusive serialisation is covered here:

http://www.boost.org/doc/libs/1_66_0/libs/serialization/doc/serializati
on.html#splittingfreefunctions

given classes:

MyNamespace::MyClass
MyNamespace::MyContainer

you could write:

namespace boost { namespace serialization {

  template<class Archive>
  void serialize(Archive & ar, MyNamespace::MyContainer& c, const
unsigned int version)
  {
     ar & c.other_members; // easy - built-in type
     ar & c.special_member;
  }

  template<class Archive>
  void serialize(Archive & ar, MyNamespace::MyClass& c, const unsigned
int version)
  {
     ar & c.foo; // easy - built-in type
     if (version > 1)
     {
       ar & c.bar; // easy - built-in type
     }
  }

}}

Or you could put the serialize template functions in the MyNamespace
namespace and reply on ADL.

On Mon, 2018-03-05 at 17:36 +0100, Lars Ruoff via Boost-users wrote:
> Maybe i didn't express it clearly enough.
> I want non-intrusive serialization.
> I want to modify neither ContqinerClass, nor MemberClass.
> (Both are just custom classes, no link with STL containers. I just
> wanted to express that Container contains an instance of Member)
>
> So how can i write
> ar & c.special_member;
> since there is no serialize member function for this class?
>
> And when i'll be using an non-intrusive (free function) serialize,
> how do i handle the version number?
>
>
>
> On Mon, Mar 5, 2018 at 4:51 PM, Robert Ramey via Boost-users <boost-u
> sers_at_[hidden]> wrote:
> > On 3/5/18 5:12 AM, Lars Ruoff via Boost-users wrote:
> > > Hi,
> > > I have a class structure like
> > >
> > > class MemberClass;
> > >
> > > class ContainerClass {
> > > MemberClass special_member;
> > > int other_members;
> > > };
> > >
> > > Following the example in http://www.boost.org/doc/libs/1_66_0/lib
> > > s/serialization/doc/
> > > i want to write a non-intrusive serialization:
> > >
> > > template<class Archive>
> > > void serialize(Archive & ar, ContainerClass & c, const unsigned
> > > int version)
> > > {
> > > ar & c.other_members; // easy - built-in type
> > > serialize(ar, c.special_member, version); //use same
> > > version???
> > > }
> > >
> > > Assuming there's is also a non-intrusive
> > > void serialize(Archive & ar, MemberClass & m, const unsigned int
> > > version);
> > >
> > > this compiles and works but i feel this is not the way to do it
> > > because it reuses the version number of the container class for
> > > the member class? So how to handle that? Must the Container class
> > > manage version of its members individually?
> > > I suggest to add a section "Non-intrusively Serializable Members"
> > > to documentation with an example.
> > >
> > > Cheers,
> > > Lars R.
> > >
> >
> > I'm not sure what the "special member" of the container class is.
> > Presumably it's your own class as STL classes have no "special
> > members". Assuming this to be the case there should be something
> > like:
> >
> > struct ContainerClass {
> > ...
> > void serialize(Achive &ar, const unsigned int v){
> > ar & other_members;
> > ar & special_member
> > }
> > ...
> > };
> >
> > or
> >
> > template<class Archive>
> > void serialize(Archive & ar, ContainerClass & c, const unsigned int
> > version)
> > {
> > ar & c.other_members; // easy - built-in type
> > ar & c.special_member;
> > }
> >
> >
> > _______________________________________________
> > Boost-users mailing list
> > Boost-users_at_[hidden]
> > https://lists.boost.org/mailman/listinfo.cgi/boost-users
>
> _______________________________________________
> 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