添加数据成员以进行升压序列化时进行跟踪
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
}
};
比如编译器在编译序列化库的时候会不会报错?
目前,我的想法是添加一些单元测试来判断 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
¹ 除了语义问题(并非每个字段都需要首先序列化)
我正在寻找任何策略,以便知道何时有人在一些已经序列化但忘记序列化的 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
}
};
比如编译器在编译序列化库的时候会不会报错?
目前,我的想法是添加一些单元测试来判断 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
¹ 除了语义问题(并非每个字段都需要首先序列化)