【问题标题】:C++ Boost serialization of a matrix of vectors向量矩阵的 C++ Boost 序列化
【发布时间】:2017-08-19 11:33:28
【问题描述】:

我正在使用<boost/serializaton>,我需要序列化一个向量矩阵,X1 类的成员,比如:

vector<vector<vector<vector<X2>>>> V;

地点:

  • V 被 X1 的构造函数初始化为 V[N][M][S]。
  • X2 是一个类,拥有一些成员和 getter/setter,有自己的 serialize() 函数(序列化两个 std::strings),它也由 X1 的 constr 初始化。

问题是:如何序列化 V?

我尝试了不同的方法,但都没有奏效。我已经阅读了 Boost 站点中的文档及其示例,但是我遗漏了一些东西。 事情是这样的:

    #include <boost/archive/binary_iarchive.hpp>
    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/serialization/vector.hpp>

    // I tried with the simplest way:
    class X1{
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & V;
        }
    //…
    }; 

    // or by calling serialization in a explicit way for each object of V:            
    class X1{ 
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & V;
            for (auto it = V.begin(); it != V.end(); ++it) {
            ar & *it;
                for (auto jt = (*it).begin(); jt != (*it).end(); ++jt) {
                ar & *jt;
                    for (auto kt = (*jt).begin(); kt != (*jt).end(); ++kt) {
                    ar & *kt;
                        for (auto wt = (*kt).begin(); wt != (*kt).end(); ++wt) {
                        ar & *wt;
                        }
                    }
                }
            }
        }
    //…
    }; 

我尝试了后者(也许我应该反过来做?)也使用范围和其他不同的方式,老实说我已经删除并且不记得了:它序列化但从序列化文件读取时崩溃。 我希望表达清楚,这是我的第一个问题。 感谢您的帮助!

【问题讨论】:

  • 之前有人告诉过你,使用这样的数据结构是一个非常糟糕的主意吗?如果没有,让我成为第一个。正确的方法是创建一个平面数组和一个访问器方法,该方法将根据其索引计算您需要的元素的位置。然后,如果您这样做,您将不需要万亿次循环,序列化将变得微不足道,性能将从中受益。
  • 是的,我知道我可以使用平面数组来完成,但我想使用 STL 容器来简化任务,因为此序列化的性能是强制性的,因为我将序列化 V 一次。无论如何,如果我不能让它工作,我会听从你的建议。谢谢。
  • 您仍然可以将 STL 容器与一维数组一起使用。 vector&lt;X2&gt; 没什么问题。
  • 操作,我的意思是“因为这个序列化的性能并不重要”

标签: c++ matrix serialization vector boost


【解决方案1】:

矢量支持是内置的,所以

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

对数据结构来说是正确的。

【讨论】:

  • 所以序列化是隐式递归的,因为包含向量的向量调用向量序列化等等?
  • @expiring_noob 是的。序列化调度是通过ADL,容器序列化只指定容器部分,但在元素对象上调度。有一些优化(例如,为了知道按位可序列化的东西) - boost.org/doc/libs/1_63_0/libs/serialization/doc/…
  • 是的,它正在工作!我必须序列化 V 的维度(即 V[N][M][S] 中的 N、M、S),然后添加到 X1 的构造函数中,该构造函数从序列化的 V 中获取数据,也是它的维度。声望不够,无法为您投票,但谢谢!
  • 我不明白你为什么需要双重序列化维度,但我相信它不会受到伤害。也许您需要 if 来避免从 vector&lt;vector&lt;vector&lt;T&gt;&gt;&gt; 中推断出它。但这又回到了@TheQuantumPhysicist 马上说的话:)
猜你喜欢
  • 2019-06-29
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多