我有一个需要序列化的树状结构。典型结构,每个节点都有 parent
成员和 children
vector 。 parent
是指向类的原始指针,children
是 shared_ptr
的 vector
。现在看起来序列化工作正常,但是 de-序列化使 parent
成员未初始化(指向 0xcccccccc
或 0x00000000
).
parent
成员是在实际父对象还没有完成反序列化时加载的,即子对象的parent
成员是通过父对象的的反序列化请求加载的> children
。由于这是循环的,我想知道是否需要采取特殊措施才能使其正常工作。
感谢您的帮助。
更新:这是我的序列化函数的样子:
template <typename Archive>
void serialize(Archive& archive, GameCore::GameObject& t, const unsigned int version)
{
archive & boost::serialization::base_object<GameCore::Object>(t);
archive & boost::serialization::base_object<GameCore::Updatable>(t);
archive & t.parent;
archive & t.transform;
archive & t.components;
archive & t.children;
}
如果我注释掉 archive & t.children
,parent
会正确填充。
更新 2: 好吧,我已经设法将它变成一个展示问题的最小样本。应编译以下内容:
#include <boost\archive\binary_oarchive.hpp>
#include <boost\archive\binary_iarchive.hpp>
#include <fstream>
#include <memory>
#include <vector>
class A
{
public:
A() {}
A(const A& rhs) = delete;
int someInt = 0;
A* parent = nullptr;
std::vector<A*> children;
template <class Archive>
void serialize(Archive& archive, const unsigned int version)
{
archive & someInt;
archive & parent;
int count = children.size();
archive & count;
children.resize(count);
for (int i = 0; i < count; ++i)
{
A* ptr = children[i];
archive & ptr;
children[i] = ptr;
}
}
};
int main()
{
A* newA = new A();
newA->someInt = 0;
A* newPtr = new A();
newPtr->someInt = 5;
newPtr->parent = newA;
newA->children.push_back(newPtr);
// Save.
std::ofstream outputFile("test", std::fstream::out | std::fstream::binary);
if (outputFile.is_open())
{
boost::archive::binary_oarchive outputArchive(outputFile);
// Serialize objects.
outputArchive << newA;
outputFile.close();
}
delete newA;
delete newPtr;
A* loadedPtr = nullptr;
// Load.
std::ifstream inputFile("test", std::fstream::binary | std::fstream::in);
if (inputFile && inputFile.good() && inputFile.is_open())
{
boost::archive::binary_iarchive inputArchive(inputFile);
// Load objects.
inputArchive >> loadedPtr;
inputFile.close();
}
return 0;
}
单步执行代码。 child 的 parent
始终保持为空。
最佳答案
好吧,显然我成了另一个倒霉 bug 的牺牲品。根据 latest Boost release page,Boost 1.55 还没有适用于 VS2013 的可用序列化库。 . 谈论浪费的时间...
Known Bugs with Visual Studio 2013/Visual C++ 12
Visual Studio 2013 was released quite late in the release process, so there exist several unresolved issues. These include:
Serialization can't compile because of a missing include.
关于c++ - boost::序列化和循环引用反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20183145/