跟踪何时为增强序列化添加数据成员
Track when adding data member for boost serialization
我正在寻找任何策略,以便知道何时有人在某些已经序列化并忘记序列化的类中添加数据成员。
例如,在下面的类中,添加了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您可以考虑将自定义规则添加到您可能拥有的任何静态分析工具中(在将来)。静态分析特性通常具有丰富的"反射"信息
¹除了语义问题(并非每个字段首先都需要序列化)
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 数据成员SFINAE的C++17测试:gcc vs clang
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 静态数据成员模板专用化的实例化点在哪里
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 将私有数据成员添加到野牛生成的类中
- 通过使用具有私有数据成员的类重载 + 运算符来添加分数
- 为什么添加静态数据成员会导致链接器失败
- 为什么为结构的多个数据成员而不是单个成员添加填充
- 添加/删除具有模板参数的数据成员
- 当派生类添加了数据成员时,派生类的构造函数应该如何像c++中那样
- C++ -<Task> 删除堆上分配的任务数组时,将列表 l(或任何 STL 容器)添加为数据成员会导致错误
- 如何将其他数据成员"number"添加到帐户类?
- 跟踪何时为增强序列化添加数据成员
- 从另一个基类向结构体添加数据成员