序列化包含指针向量的struct,每个指针包含其他指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化包含指针向量的struct,每个指针包含其他指针相关的知识,希望对你有一定的参考价值。

我正在尝试使用Boost序列化包含向量和整数的minHeap对象。

struct minHeap {
    std::vector<keyNode> heapStructure; // A vector of many keyNodes
    int size; // Current size of vector
    minHeap() {
        size = 0;
    }
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned version)
    {
        ar & heapStructure;
        ar & size;
    }
}; 

现在heapStructurekeyNode的矢量,每个keyNode包含一个字符,整数和对象keyNode本身的两个指针。

struct keyNode {
    char data; // The character itself
    int frequency; // Occurances of the character in the data stream.
    keyNode * leftNode, *rightNode;  // Left and right children of the root node (the keyNode itself)
    keyNode() {
        data = NULL;
        frequency = 0;
        leftNode = NULL;
        rightNode = NULL;
    }
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned version)
    {
        ar &data;
        ar &frequency;
        ar &leftNode;
        ar &rightNode;

    }
};

下面(示例)代码显示了我如何序列化和反序列化文件。

// Write Encoded Stream to File
ofstream outFile;
string outPath = filePath + ".enc";
outFile.open(outPath, ios::out | ios::binary); // TODO: Fix the output path
bitsetR bitStorage(outputStream);
boost::archive::binary_oarchive output(outFile);
output << bitStorage;
output << hTree;
outFile.close();
ifstream inFile;
inFile.open("demo.txt.enc"); // TODO: Fix the output path
bitsetR bitStr("");
boost::archive::binary_iarchive input(inFile);
minHeap temp;
input >> bitStr;
input >> temp;

序列化时没有出现任何错误,但反序列化失败,出现以下错误(VS 2017):

Exception Thrown: Input Stream Error (boost::archive::archive_exception)

我应该在这里注意到bitsetR对象成功反序列化。反序列化minHeap对象时抛出异常。

答案

我认为所需要的只是以正确的顺序正确刷新和关闭存档和流。这段代码工作正常:

Live On Coliru

#include <boost/serialization/serialization.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/vector.hpp>

struct keyNode {
    char data          = 0;       // The character itself
    int frequency      = 0;       // Occurances of the character in the data stream.
    keyNode *leftNode  = nullptr;
    keyNode *rightNode = nullptr; // Left and right children of the root node (the keyNode itself)

  private:
    friend class boost::serialization::access;
    template <class Archive> void serialize(Archive &ar, unsigned) {
        ar &data;
        ar &frequency;
        ar &leftNode;
        ar &rightNode;
    }
};

struct minHeap {
    std::vector<keyNode> heapStructure; // A vector of many keyNodes
    size_t size() const { return heapStructure.size(); }

  private:
    friend class boost::serialization::access;
    template <class Archive> void serialize(Archive &ar, unsigned) {
        ar &heapStructure;
    }
};

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <fstream>

int main() {
    minHeap hTree;

    {
        std::ofstream outFile("demo.txt.enc", std::ios::binary);
        {
            boost::archive::binary_oarchive output(outFile);
            output << hTree;
        }
    }

    {
        std::ifstream inFile("demo.txt.enc");
        boost::archive::binary_iarchive input(inFile);
        minHeap temp;
        input >> temp;
    }
}

注意我可以通过删除范围使其失败并显示类似的消息:

int main() {
    minHeap hTree;

    std::ofstream outFile("demo.txt.enc", std::ios::binary);
    boost::archive::binary_oarchive output(outFile);
    output << hTree;

    std::ifstream inFile("demo.txt.enc");
    boost::archive::binary_iarchive input(inFile);
    minHeap temp;
    input >> temp;
}

打印Live On Coliru

terminate called after throwing an instance of 'boost::archive::archive_exception'
  what():  input stream error
bash: line 7: 16838 Aborted                 (core dumped) ./a.out

以上是关于序列化包含指针向量的struct,每个指针包含其他指针的主要内容,如果未能解决你的问题,请参考以下文章

c++ 内存分配向量的指针

从类指针向量创建成员变量向量

包含指针的向量

如何重建包含向量的非指针类成员?

创建字符指针向量以指向字符串向量

如何访问包含指向字符串的指针的向量的元素?