【问题标题】:How to load a serialized boost::variant?如何加载序列化的 boost::variant?
【发布时间】:2011-07-20 11:53:53
【问题描述】:

我无法使用boost::serialization,因为它具有库依赖项,所以我试图自己找到一种方法。这是否意味着从boost::serialization复制并不重要。

在阅读this answer to a similar question 后,我查看了boost/serialization/variant.hpp,发现save() 函数对我来说是直截了当且易于理解的。

但是load() 函数看起来更复杂:有一个涉及load()variant_impl<types>::load() 的递归以及一个递减的which 参数。 因此,显然代码会迭代每种类型的变体,以便将 int which 转换为类型。 其余的我都想不通了。

我知道 boost 有很多代码可以使其可移植,所以也许有一种不太便携但更简单的方法来做到这一点?

【问题讨论】:

    标签: c++ serialization boost deserialization boost-variant


    【解决方案1】:

    如果您要从 boost/serialization/variant.hpp 的副本中删除序列化内容(存档模板参数除外) - 即抛出您自己的异常类型并更改例如

    ar >> BOOST_SERIALIZATION_NVP(which);
    // to:
    ar >> which;
    

    那么看起来你应该能够在保存/加载函数中分别用 std::ostream 或 std::istream 替换存档。

    没试过,但乍一看应该可以。

    如果不使用 boots::serialization,我想这确实取决于您实际使用什么来序列化数据?

    【讨论】:

    • 我正在尝试将我的数据放入 MFC CArchive 对象中...我尝试删除 NVP 内容,但 CArchive 似乎并不适合所有这些。 .
    • @foraidt : CArchive 仅适用于派生自 CObject 的类型,而 boost::variant<> 显然不适用。
    • @ildjarn CArchive::operator<<() 被很多类型重载(参见msdn.microsoft.com/en-us/library/331a7zh8%28v=vs.80%29.aspx)。这允许序列化远远超过CObject 派生类。我的目标不是序列化 variant 本身,而是序列化它包含的数据。
    • 如果您尝试序列化变体包含的数据,那么您肯定必须序列化变体,因为从本质上讲,它会改变数据的实际情况。您是否尝试过按照我的建议并将 CArchive 作为存档类型传递?仔细观察,您还需要从标题中删除“序列化”功能,并酌情调用“加载”或“保存”。当你说 CArchive 不合适时,是因为它不会编译吗?
    • 即调用 int 版本 = 0; C存档ar;加载(ar,my_variant,版本)
    猜你喜欢
    • 1970-01-01
    • 2019-04-26
    • 2010-11-14
    • 1970-01-01
    • 2019-10-24
    • 2012-04-16
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多