【问题标题】:How to serialize a 3D array with boost?如何使用 boost 序列化 3D 数组?
【发布时间】:2011-05-21 19:45:53
【问题描述】:

好的,我最近切换到 boost,我部分了解序列化简单对象或简单类(boost 教程让我很困惑),但是如何序列化包含类成员的 3D 数组?

我有一个名为 TileList 的数组 (std::vector),其中包含 Tile 类的对象,而 Tile 类只包含两个变量 int TileID 和 int TilePassability。 p>

我尝试按照序列化教程在非侵入式方法和 STL 容器方法中所做的那样做,但我只是得到一堆错误作为回报。有人可以解释如何正确地做到这一点吗?谢谢。

【问题讨论】:

  • 贴出你试过的代码和你得到的错误。
  • 好吧,我知道我的代码完全错误,所以我希望有一个类似的简单示例(使用类对象成员序列化向量)
  • 我自己去过那里我可以证明:不!您需要修复您的代码,否则您将无法开始设置其中的逻辑。 Boost 可能很拥挤(至少是错误),但它非常一致。让自己看到模式。 (50% 说你错过了包含;30% 说你混合了命名空间(占位符?) 2% 说你遇到了错误或限制)
  • @sehe:是的,在过去的几个月里,我学到了这一点,但我需要的只是一个简单的例子,让我了解如何让它发挥作用。

标签: c++ visual-studio-2010 boost-serialization multidimensional-array


【解决方案1】:

所以我知道你有这样的东西(这不是一个真正的 3D 数组,如果我误读了你,请发布你想要序列化的确切代码):

struct Tile {
    int id, passability;
};

std::vector<Tile> tileList;

因为std::vector 已经可以通过标准的Boost.Serialization 工具进行序列化,所以您只需要将Tile 设为可序列化。最简单的方法是添加一个serialize 成员,该成员同时进行加载和保存。

struct Tile {
   int id, passability;

   template <typename Archive>
   void serialize(Archive& ar, const unsigned version) {
       ar & id;
       ar & passability;
   }
};

就是这样,你的类型现在是可序列化的。需要考虑的特殊事项包括类成员是私有的——在这种情况下,您需要为 Boost.Serialization 添加友元声明,即

class Tile {
    int id, passability;
    friend class boost::serialization::access;

    template <typename Archive>
    void serialize(Archive& ar, const unsigned version) {
        ar & id;
        ar & passability;
    }
public:
    Tile(int, int);
};

serialize 成员必须是一个模板(嗯,不是真的;但除非你对库有更好的了解,否则它必须是),所以它的整个主体必须​​包含在类声明中(除非你使用显式实例化,但这也不适合初学者)。

您也可以将其拆分为 saveload 成员,但在您开始使用版本控制之前,这没什么用。它看起来像这样:

struct Tile {
    int id, passability;

    BOOST_SERIALIZATION_SPLIT_MEMBER()
    template <typename Archive>
    void save(Archive& ar, const unsigned version) { ... }
    template <typename Archive>
    void load(Archive& ar, const unsigned version) { ... }
};

这使得向量持有的类型可序列化。序列化向量本身就是archive &amp; tileList

【讨论】:

  • 感谢您的帮助,我设法修改它以适合我的代码并且它可以工作(我得到的唯一错误是 Visual Studio 请求 libboost_serialization-vc100-mt-1_46_1.lib 而不是 boost_serialization- vc100-mt-1_46_1)。我还有最后一个问题,如何将序列化的对象加载回同一个数组中?我使用 ofstream 保存了它。哦,是的,它是一个 3D 数组,我有 TileList[x][y][z],其中每个条目都等于一个 Tile(这是我正在做的一个简单的游戏来学习 SDL)
  • @Speed:同样,&amp; 既适用于阅读也适用于写作。只需使用iarchive
  • 我还有一个问题:“哦,是的,它是一个 3D 数组,我有 TileList[x][y][z],其中每个条目都等于一个 Tile(这是一个简单的游戏我正在学习 SDL)”。这会使序列化有什么不同吗?
  • @Speed:嗯,你说的是矢量。如果您有 multidim 数组,请考虑使用 Boost.MultiArray。我不记得默认情况下它是否可序列化 - 如果不是,您可以使用三个 for 循环并序列化每个 TileList[i][j][k]。不过,序列化原始数组应该可以正常工作。
  • 不不,我有一个 3D 矢量(std::vector<:vector>>>)。从外观上看,这些作品的序列化很好,因为一切都编译并完美运行。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2020-09-19
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多