如何序列化 boost::dynamic_bitset?

2023-12-29

如何使用 boost::dynamic_bitset 成员序列化类?

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/dynamic_bitset.hpp>
#include <boost/serialization/bitset.hpp>
#include <sstream>

class A
{
    friend class boost::serialization::access;
    boost::dynamic_bitset<> x;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int){
        ar & x;
    }
};

int main()
{
    A a;
    std::stringstream ss;
    boost::archive::text_oarchive oa(ss);
    oa << a;
    return 0;
}

编译报错(boost 1.57)

In file included from /usr/include/boost/serialization/extended_type_info_typeid.hpp:37:0,
                 from /usr/include/boost/archive/detail/oserializer.hpp:38,
                 from /usr/include/boost/archive/detail/interface_oarchive.hpp:23,
                 from /usr/include/boost/archive/detail/common_oarchive.hpp:22,
                 from /usr/include/boost/archive/basic_text_oarchive.hpp:32,
                 from /usr/include/boost/archive/text_oarchive.hpp:31,
                 from dynamic_bitset_setial.cpp:1:
/usr/include/boost/serialization/access.hpp: In static member function ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = boost::dynamic_bitset<>]’:
/usr/include/boost/serialization/serialization.hpp:69:5:   instantiated from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = boost::dynamic_bitset<>]’
/usr/include/boost/serialization/serialization.hpp:128:9:   instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = boost::dynamic_bitset<>]’
/usr/include/boost/archive/detail/oserializer.hpp:148:5:   instantiated from ‘void boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::archive::text_oarchive, T = boost::dynamic_bitset<>]’
dynamic_bitset_setial.cpp:25:1:   instantiated from here
/usr/include/boost/serialization/access.hpp:118:9: error: ‘class boost::dynamic_bitset<>’ has no member named ‘serialize’

我继续说:提交了拉取请求 https://github.com/boostorg/dynamic_bitset/pull/14为 Boost Dynamic Bitset 添加序列化支持

使用公共接口的序列化并不是最佳的,因为to_block_range()/from_block_range()需要复印m_bits(以及随后的resize()).

我为 Boost Dynamic Bitset 添加了一个通用实现。这些更改干净地合并到开发或主控 (1_58_0) 中。

Changes

实施添加了

  • 侵入性最小,只有嵌套的朋友(class serialization_impl;)已被转发声明为“钥匙孔”所需的好友访问权限
  • 此类以及用于 Boost Serialization 的实际 ADL 挂钩在单独的标头中实现(dynamic_bitset/serialization.hpp,类似于其他具有序列化支持的 boost 库)。
  • 这意味着对 Boost Serialization 的依赖为零,除非boost/dynamic_bitset/serialization.hpp实际上包含在内
  • 实现零拷贝(利用std::vector<Block>Boost Serialization 中的内置支持)

Tests

拉取请求中的第二次提交添加了对此功能的测试。我不知道如何添加dyn_bitset_unit_tests5.cpp到 Jam 文件。我认为必须采取其他措施来确保链接到 Boost System 和 Boost Serialization。我自己使用一个简单的包装器运行了测试:

#include <modular-boost/libs/dynamic_bitset/dyn_bitset_unit_tests5.cpp>

int main() {
    test_main(0, nullptr);
}

然后可以使用例如编译和运行

g++ main.cpp -lboost_system -lboost_serialization && ./a.out

没有输出意味着没有错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何序列化 boost::dynamic_bitset? 的相关文章

随机推荐