提升包含 unique_ptr pont 到的其他对象的对象的序列化 [duplicate]

boost serialization on objects containing other objects ponted to by unique_ptr [duplicate]

提问人:JamalNewtron 提问时间:10/5/2023 最后编辑:EvgJamalNewtron 更新时间:10/5/2023 访问量:32

问:

这个问题在这里已经有答案了:
上个月关闭。

这篇文章在上个月被编辑并提交审查,但未能重新打开该帖子:

重复这个问题已经得到回答,不是唯一的,也没有与另一个问题区分开来。

我有一个 A 类的对象,它是来自不同类 X、Y、Z 的其他几个对象的组合......这些类是通过unique_ptr指向的。假设子类 X、Y、Z 只有基元数据类型。

我正在尝试序列化我的对象,因此我在类 A 中添加了一个保存和加载方法。对于类 A 的原始数据类型成员,这行得通。

// Class A HPP:
private:
int m_classXID{};
std::unique_ptr<Class_X> m_classXObject;

...
template<class Archive>
void save(Archive& ar, const unsigned int version) const;

template<class Archive>
void load(Archive& ar, const unsigned int version);

template<class Archive>
void serialize(Archive& ar, const unsigned int version);
...

实现:

// Class A CPP:
...
template<class Archive>
void Class_A::save(Archive& ar, const unsigned int version) const
{
    ar << m_classXID;
}

template<class Archive>
void Class_A::load(Archive& ar, const unsigned int version)
{
    ar >> m_classXID;
}

template<class Archive>
void Class_A::serialize(Archive& ar, const unsigned int version)
{
    boost::serialization::split_member(ar, *this, 1);
}
...

现在我想更进一步,尝试为其中一个子类实现序列化。

例如,我所做的是将以下代码添加到类 X 中:

// Class X HPP:
private:
// Gives the serialization infrastructure access to the serialize function!
friend class boost::serialization::access;
// Archive
template<class Archive>
void serialize(Archive& ar, const unsigned int version);

实施部分:

// Class X CPP:
template <typename Archive>
void Class_X::serialize(Archive& ar, const unsigned int version)
{
    ar& m_firstInt;
    ar& m_secondInt;
    ar& m_thirdInt;
    ar& m_fourthInt;
    ...;
}

现在我完全不知道如何处理 A 类的 save 和 load 方法的实现部分。

我尝试了很多,甚至不记得是什么。我目前所处的位置如下所示:

template<class Archive>
void Class_A::save(Archive& ar, const unsigned int version) const
{
    ar << m_classXID;
    ar << m_classXObject;
}

template<class Archive>
void Class_A::load(Archive& ar, const unsigned int version)
{
    ar >> m_classXID;
    m_classXObject = std::make_unique<Class_X>();
    ar >> m_classXObject;
}

template<class Archive>
void Class_A::serialize(Archive& ar, const unsigned int version)
{
    boost::serialization::split_member(ar, *this, 1);
}

但是我从 Microsoft Visual Studio 收到一条关于“未解析的外部符号...LINK2019。我想对我的方法进行审查。LINK错误不是我主要关心的问题。

更新:非常感谢模板的提示!->仅在标题中。这需要我几天的时间才能解决!非常感谢!!将所有内容移动到头文件中解决了这个问题。

C++ 序列化 提升 unique-ptr

评论

0赞 463035818_is_not_an_ai 10/5/2023
“我想对我的方法进行审查。LINK错误不是我最关心的问题。 如果链接错误不是问题,为什么要提及它?当 QUestions 具体且重点突出时,它们最好被接受。如果问题涉及链接器错误,那么我们将帮助您解决链接器错误。另一方面,评论被认为是偏离主题的
2赞 molbdnilo 10/5/2023
为什么模板只能在头文件中实现?

答: 暂无答案