【问题标题】:Serializing a class with member that is vector<unique_ptr<string>> with boost::serialization使用 boost::serialization 序列化一个成员为 vector<unique_ptr<string>> 的类
【发布时间】:2019-12-28 16:07:41
【问题描述】:

有一个类似的sounding question,但它完全不同,因为它与被序列化的类的unique_ptr 向量有关。 我想有一种方法来序列化作为向量的成员。

What I have tried and does not work:

#include<vector>
#include<string>
#include<sstream>
#include<iostream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/unique_ptr.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/forward_list.hpp>
#include <boost/serialization/serialization.hpp>
using namespace boost::archive;
class Person {
    std::vector<std::unique_ptr<std::string>> data_;
    public:
    Person(){
        data_.emplace_back(nullptr);
        data_.emplace_back(new std::string("Bjarne!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"));
    }
    private:
    friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive &ar,const unsigned int)
{
  ar & data_;
}
    public:
    const std::vector<std::unique_ptr<std::string>>& data() const{
        return data_;
    }

};

int main() {
    std::stringstream ss;
    Person p;
    text_oarchive oa{ss};
    oa << p;
    text_iarchive ia{ss};
    Person read;
    ia >> read;
    for (const auto& ptr : read.data()) {
        std::cout << *ptr; 
    }
}

【问题讨论】:

  • 指向字符串的指针向量似乎没有意义。为什么不只有一个字符串向量?为什么需要空指针?
  • 这是一个例子,它可以是一个只移动UDT的指针
  • std::unique_ptr 也是只能移动的,所以这不是论据......不过,仍然可以接受,因为您需要 polymorphic 类型的指针(好吧,指针与值的问题,空指针是另一回事!)。
  • 你是对的,更好的例子是指向没有有效移动的类型的指针,例如大型 std::array 或一些古老的 3rd 方代码类。
  • 最好的例子是多态类型,因为你不能做任何不同于存储指针的事情,否则你会遭受对象切片的影响;)

标签: c++ boost boost-serialization


【解决方案1】:

作为@CuriouslyRecurringThoughts cmets,当您想要序列化时,避免使用std::unique_ptrs 作为标记无值,使用boost::optional 而不是serialize

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 2018-02-02
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多