boost::serialization::traits 的具体例子?

Posted

技术标签:

【中文标题】boost::serialization::traits 的具体例子?【英文标题】:A concrete example of boost::serialization::traits? 【发布时间】:2012-02-22 12:35:26 【问题描述】:

考虑一个结构来序列化:

struct MyStruct 
   int a;
   std::string b;

template<class Archive>
void serialize(Archive &ar, const unsigned int)
   
   ar & a & b;
   
;

我想使用 boost::serialization::traits 明确地标记它为track_neverobject_serializable。我盯着traits docs,但似乎无法弄清楚如何应用它,也无法在任何地方找到示例。所以...

a) 将特征应用于这个特定类的代码是什么?

b) 验证每个都已就位的BOOST_STATIC_ASSERT() 是什么?

c) 我假设我无法创建此类primitive_type,因为在典型的归档类中没有可以直接处理此类型的成员函数或模板。对吗?

我不关心跨平台或跨版本存档的兼容性,只是快速读取(和写入)和入侵MyStruct 是可以的,但如果可能的话,很高兴看到它以两种方式完成。

【问题讨论】:

【参考方案1】:

由于MyStruct 不是应用特征的模板化结构或类,您只需使用BOOST_CLASS_IMPLEMENTATION 和BOOST_CLASS_TRACKING 宏:

在您的类定义之外,您需要编写以下两行:

BOOST_CLASS_IMPLEMENTATION(MyStruct, boost::serialization::object_serializable);
BOOST_CLASS_TRACKING(MyStruct, boost::serialization::track_never);

一个 BOOST_STATIC_ASSERT() 来验证你做的是正确的事情看起来像:

BOOST_STATIC_ASSERT(boost::serialization::implementation_level<MyStruct>::value 
                    == boost::serialization::object_serializable);
BOOST_STATIC_ASSERT(boost::serialization::tracking_level<MyStruct>::value 
                    == boost::serialization::track_never);

我会说将其设为原始类型是没有意义的,因为它不是原始类型。

【讨论】:

事实证明,以上两个宏需要完全按照您放置它们的顺序。我把它们颠倒了,这就是为什么它对我不起作用。最后的分号不是必需的,但没有害处。 (顺便说一下,这都是 MinGW-32/gcc-4.4。)

以上是关于boost::serialization::traits 的具体例子?的主要内容,如果未能解决你的问题,请参考以下文章