添加数据成员以进行升压序列化时进行跟踪

Track when adding data member for boost serialization

我正在寻找任何策略,以便知道何时有人在一些已经序列化但忘记序列化的 classes 中添加数据成员。

例如,在下面添加了 class 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

比如编译器在编译序列化库的时候会不会报错?

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

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

我认为单元测试才是正确的选择。

在没有反射语言设施的情况下,没有万无一失的方法来检查你想要什么¹。此外,您还可以在序列化方法中静态断言 sizeof(MyClass) 。当然,如果保持网络 class 大小不变,这不会检测到更改,但它更好总比没有好。

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

Idea You could think about adding custom rules to any static-analysis tools you may have (in the future). Static analysis features usually have rich "reflection" information


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