c++ - 反序列化没有默认构造函数的类型的STL容器

标签 c++ boost boost-serialization

我最近学习了反序列化构造函数 (Deserializing constructor doesn't read data correctly) 的模式,以便对没有默认构造函数的类型使用序列化。现在我正在尝试序列化这些对象的 STL 容器,如下例所示:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/vector.hpp>

#include <fstream>

class Point
{
public:
    Point(double x) : mX(x) {}

    template<class TArchive>
    Point(TArchive& archive)
    {
        archive >> *this;
    }

    template<class TArchive>
    void serialize(TArchive& archive, const unsigned int version)
    {
        archive & mX;
    }

    double mX;
};

int main()
{
    std::vector<Point> pointVector;
    pointVector.push_back(Point(1));
    pointVector.push_back(Point(2));

    std::ofstream outputStream("test.txt");
    boost::archive::text_oarchive outputArchive(outputStream);

    outputArchive << pointVector;
    outputStream.close();

    std::vector<Point> readPointVector;
    std::ifstream inputStream("test.txt");
    boost::archive::text_iarchive inputArchive(inputStream);
    inputArchive >> readPointVector; // Compiler error - no matching function call to Point::Point()

    return 0;
}

这似乎很明显这不应该起作用,但我如何告诉存档它需要使用反序列化构造函数来构造它在将它们添加到容器之前读取的对象?

------------ 编辑------------

在唯一答案中实现建议后,这段代码编译正常,但似乎没有正确反序列化。 readPointVector 的大小只有 1,但它的大小应该为 2(而且它包含的一个对象中的数据不正确):

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>

#include <fstream>

class Point
{
public:
    Point(double x) : mX(x) {}

    template<class TArchive>
    Point(TArchive& archive)
    {
        archive >> *this;
    }

    template<class TArchive>
    void serialize(TArchive& archive, const unsigned int version)
    {
        archive & mX;
    }

    double mX;
};

template <typename Archive>
Archive& operator >> (Archive& archive, std::vector<Point>& points)
{
    points.emplace_back(archive);
    return archive;
}

int main()
{
    std::vector<Point> pointVector;
    pointVector.push_back(Point(5.6));
    pointVector.push_back(Point(7.8));

    std::cout << pointVector.size() << std::endl; // outputs 2

    {
        std::ofstream outputStream("test.txt");
        boost::archive::text_oarchive outputArchive(outputStream);

        outputArchive << pointVector;
        outputStream.close();
    }

    std::vector<Point> readPointVector;
    std::ifstream inputStream("test.txt");
    boost::archive::text_iarchive inputArchive(inputStream);
    inputArchive >> readPointVector;

    std::cout << readPointVector.size() << std::endl; // outputs 1 (and readPointVector[0].mX is 2, but should be 7.8)

    return 0;
}

最佳答案

你可以专攻点 vector :

template <typename Archive>
Archive& operator >> (Archive& archive, std::vector<Point>& points)
{
    points.emplace_back(archive);
    return archive;
}

关于c++ - 反序列化没有默认构造函数的类型的STL容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35732363/

相关文章:

c++ - 如何在 C++ 中为 Backus Naur Form 创建规则?-

c++ - boost::asio 接受套接字错误已经打开

boost - 在 boost::spirit 语法中翻转规则内的子规则顺序会导致段错误

c++ - Boost.Serialization 是否释放加载指针期间创建的内存?

c++ - boost 空 std::forward_list 的序列化

c++ - UDP套接字开始接收失败

c++ - SIGSEGV,段错误。 while printf() 数组索引的值

c++ - Boost asio::deadline_timer 在超时前重置

c++ - 在 dll 中定义的派生嵌套类的序列化

C# 使用包装类中的字符串参数调用 C++ 方法