Как повысить :: сериализацию указателей и ссылки? - PullRequest
0 голосов
/ 26 мая 2019

Мне нужно сериализовать класс с полями: int, указатель на int, массив, объект класса, указатель на объект класса, ссылку на объект класса, указатель на объект класса с виртуальным родителем.

Я пытался это реализовать. Мне удалось сделать для int и array. Но я не могу разобраться с указателями и ссылками

class B() {};

class Person
{
 public:
int age; // work
    int *ageptr = &age; // not work
std::vector<int> favoriteNumbers; //work

    B b; // not work
    B *bptr = &b; // not work
    B &bref = b; // not work

Person();
~Person();

private:
    friend class boost::serialization::access;
    template <class Archive>
    void serialize(Archive &ar, const unsigned int version) {
        ar &BOOST_SERIALIZATION_NVP(age);
        ar &BOOST_SERIALIZATION_NVP(ageptr); // error
        ar &BOOST_SERIALIZATION_NVP(b); // error
        ar &BOOST_SERIALIZATION_NVP(bptr); // error
        ar &BOOST_SERIALIZATION_NVP(bref); // error
        ar &BOOST_SERIALIZATION_NVP(favoriteNumbers);
    }
};

1 Ответ

0 голосов
/ 26 мая 2019

В вашем конкретном случае, поскольку ссылки и указатели ссылаются на переменные-члены, их не нужно сериализовать / десериализовать. Конструктор уже установил для этих членов правильные значения.

Что касается сериализации указателей, прочитайте раздел «Указатели» руководства по сериализации .

Вы не можете десериализовать ссылки в целом, потому что они являются псевдонимами для других объектов и не могут быть переназначены для ссылки на другой объект. Кроме того, взятие адреса и sizeof ссылки возвращает адреса объекта, на который делается ссылка. Я бы также рекомендовал вообще не использовать ссылочные элементы .

...