如何提升::序列化指针和引用?

Posted

技术标签:

【中文标题】如何提升::序列化指针和引用?【英文标题】:How to boost::serialize pointers and reference? 【发布时间】:2019-05-26 10:23:35 【问题描述】:

我需要用字段序列化一个类: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】:

在您的特定情况下,由于引用和指针引用成员变量,它们不需要被序列化/反序列化。构造函数已经将这些成员设置为正确的值。

关于序列化指针,请阅读 serialization tutorial 的指针部分。

但是,您通常不能反序列化引用,因为它们是其他对象的别名,并且不能重新分配它们以引用另一个对象。此外,获取引用的地址和sizeof 会返回被引用对象的地址和sizeof。我也愿意recommend against using reference members。

【讨论】:

以上是关于如何提升::序列化指针和引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何序列化包含指向原语的指针的类?

在没有包装器的情况下提升指向基元的指针的序列化

指针的Boost序列化保存指针的十六进制值而不是对象的内容

什么是提升序列化地图加载时间?

序列二叉树和反序列 (不是自己做的)

以自定义方式提升序列化数据