【问题标题】:A concrete example of boost::serialization::traits?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 是可以的,但如果可能的话,很高兴看到它以两种方式完成。

【问题讨论】:

    标签: c++ boost boost-serialization


    【解决方案1】:

    由于MyStruct 不是应用特征的模板化结构或类,您只需使用BOOST_CLASS_IMPLEMENTATIONBOOST_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。)
    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多