使用<string>提升::序列化序列化具有 vector<unique_ptr> 成员的类

Serializing a class with member that is vector<unique_ptr<string>> with boost::serialization

本文关键字:gt 序列化 lt ptr 成员 unique vector 提升 使用 string      更新时间:2023-10-16

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

我已经尝试过但不起作用:

#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; 
}
}

正如@CuriouslyRecurringThoughts注释,当您想要序列化时,请避免将std::unique_ptrs 用于哨兵无值,而是使用boost::optional进行序列化。