Boost序列化版本信息
Posted
技术标签:
【中文标题】Boost序列化版本信息【英文标题】:Boost serialization version information 【发布时间】:2013-12-12 16:34:06 【问题描述】:在使用 Boost Serialization 进行序列化时,有什么方法可以删除放在序列化数据开头的额外 6 个字节?我只想使用序列化机制,我不想要任何版本、对象跟踪或任何其他头信息。
【问题讨论】:
我相信构造函数的 no_header 标志可能会做你想做的事。 已经尝试过no_header
标志,它会删除一个文本标题,但不会删除额外的 6 个字节。
也许您可以派生自己的存档类并将 void save(const version_type & t) 和 void load(version_type & t) 覆盖为无操作?此外还有其他类型的类版本,boost::serialization::item_version_type。
【参考方案1】:
我使用implementation level 解决了我的问题:
BOOST_CLASS_IMPLEMENTATION(MyClass, boost::serialization::object_serializable);
通过这样做,序列化将不包括原始序列化数据前面的版本。
【讨论】:
【参考方案2】:如果您想省略所有类的版本信息(导致空间效率更高,但存档的健壮性较差),您可以将 BOOST_CLASS_IMPLEMENTATION 宏与默认行为结合起来:
namespace boost
namespace serialization
template <class T>
struct implementation_level_impl< const T >
template<class U>
struct traits_class_level
typedef BOOST_DEDUCED_TYPENAME U::level type;
;
typedef mpl::integral_c_tag tag;
typedef
BOOST_DEDUCED_TYPENAME mpl::eval_if<
is_base_and_derived<boost::serialization::basic_traits, T>,
traits_class_level< T >,
//else
BOOST_DEDUCED_TYPENAME mpl::eval_if<
is_fundamental< T >,
mpl::int_<primitive_type>,
//else
BOOST_DEDUCED_TYPENAME mpl::eval_if<
mpl::or_<is_class< T >, is_array< T> >,
mpl::int_<object_serializable>,
//else
BOOST_DEDUCED_TYPENAME mpl::eval_if<
is_enum< T >,
mpl::int_<primitive_type>,
//else
mpl::int_<not_serializable>
>
>
>
>::type type;
BOOST_STATIC_CONSTANT(int, value = type::value);
;
【讨论】:
【参考方案3】:同时使用:
BOOST_CLASS_IMPLEMENTATION(, boost::serialization::object_serializable) BOOST_CLASS_TRACKING(, boost::serialization::track_never)
按此顺序。
【讨论】:
以上是关于Boost序列化版本信息的主要内容,如果未能解决你的问题,请参考以下文章
我可以告诉 Boost.MPI 哪个类版本与 Boost.Serialization 一起使用吗?
序列化具有嵌入类的boost类,但仅对包装器中的信息进行序列化