c++ - boost::序列化和循环引用反序列化

标签 c++ serialization boost c++11

我有一个需要序列化的树状结构。典型结构,每个节点都有 parent 成员和 children vector 。 parent 是指向类的原始指针,childrenshared_ptrvector。现在看起来序列化工作正常,但是 de-序列化使 parent 成员未初始化(指向 0xcccccccc0x00000000).

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.childrenparent 会正确填充。

更新 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/

相关文章:

c++ - 启用优化时出现 g++ 段错误

c++ - 重定向和时间戳 std::cout

c++ - 100% 的数组在函数中正确,75% 的数组在 CALLING 函数中正确 - C

java - 为什么这个对象序列化不起作用?

c++ - boost::posix_time::from_iso_string 允许错误输入

c++ - 如何在 C++ 中获取 char 的整数值?

C#序列化一个没有无参数构造函数的类

json - 如何强制 AngularJS 序列化空表单字段

c++ - 使用 boost-spirit 的函数解析器

c++ - 文件/ifstream 的双向迭代器