跟踪何时为增强序列化添加数据成员

Track when adding data member for boost serialization

本文关键字:添加 数据成员 序列化 增强 何时 跟踪      更新时间:2023-10-16

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

例如,在下面的类中,添加了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
    }
};

生活代码

例如,编译器在编译序列化库时是否可能抛出错误?

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

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

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

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

单元测试通过关注相关的事情来回避所有的问题。我真的认为更多的结构验证应该是代码审查的一部分。

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


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