【问题标题】:Track when adding data member for boost serialization为提升序列化添加数据成员时跟踪
【发布时间】:2015-10-08 08:23:00
【问题描述】:

我正在寻找任何策略,以了解何时有人在某些已序列化的类中添加数据成员而忘记对其进行序列化。

例如,在以下类中添加了bar,但未在访问结构中序列化。

// In implementation library
class A {
public:
    struct access;
    A(float f, int b) : foo(f), bar(b) {}
private:
    float foo;
    int bar; // A user just 'added' bar data member
};

// In serialization library
struct A::access {
    template <class Archive>
    static void serialize(Archive &ar, A &a, const unsigned int) {
        ar & BOOST_SERIALIZATION_NVP(a.foo); 
        // bar serialization is missing here but compiler does not complain
    }
};

Live code

例如,编译器在编译序列化库时会不会抛出错误?

目前,我想出的想法是添加一些单元测试来判断序列化/反序列化场景是否会给出正确的行为。

我正在寻找一些更智能、一些简单的方法,而不需要复杂的反射技术(我不能在我的实现库中使用 boost)。

【问题讨论】:

    标签: c++ serialization boost c++03


    【解决方案1】:

    我认为单元测试是正确的方法,真的。

    在没有反射语言工具的情况下,没有万无一失的方法来检查您想要的内容¹。您还可以做的是在您的序列化方法中静态断言sizeof(MyClass)。当然,这不会检测到保持网络类大小不变的变化,但它更好总比没有。

    单元测试通过关注相关事物来回避所有问题。老实说,我认为任何更多的结构验证都应该成为代码审查的一部分。

    想法您可以考虑将自定义规则添加到您可能拥有的任何静态分析工具中(将来)。静态分析特征通常具有丰富的“反射”信息


    ¹除了语义问题(并非每个字段都可能需要首先序列化)

    【讨论】:

    • 再次感谢您的见解。一位同事还建议检查 sizeof。我会尝试并依赖单元测试。我还保留了您关于使用静态分析帮助的想法:)
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多