Ass*_*vie 5 c++ xml serialization boost
当使用BOOST_SERIALIZATION_NVP宏为XML序列化创建名称 - 值对时,编译器很乐意允许编译以下代码,即使元素名称不是有效的XML元素,并且在尝试将对象实际序列化为XML时会抛出异常:
BOOST_SERIALIZATION_NVP(_member[index])
Run Code Online (Sandbox Code Playgroud)
一个明显的解决方法是使用:
boost::serialization::make_nvp("ValidMemberName", _member[index])
Run Code Online (Sandbox Code Playgroud)
但任何人都可以建议一种修改boost的方法,以便非法元素名称会触发编译错误吗?(因此不依赖于单元测试来捕获上述微妙的bug)
编辑:
一种想法是以某种方式声明一个虚拟局部变量,其中传递给宏的元素的名称,假设C++中的有效标识符集是有效XML元素的子集.不完全确定这可以做到.
我认为你的想法可能会奏效。有效的 C++ 标识符由 AZ、az、0-9 和下划线组成,这实际上是 XML 标识符的正确子集(它将连字符、句点和一堆 Unicode 字符添加到集合中)。
您可以尝试这样的构造来获得编译时错误:
#define SAFE_BOOST_SERIALIZATION_NVP(name) \
{ int name = 0; } ; BOOST_SERIALZATION_NVP(name)
Run Code Online (Sandbox Code Playgroud)
大括号将虚拟变量的范围限制为该行,因此您不会因虚假变量而使函数变得混乱。编译器可能也会优化虚拟变量,因此没有运行时成本。当我在下面的代码中使用这个宏时,我得到error: invalid intializer:
#include "boost/serialization/nvp.hpp"
#define SAFE_BOOST_SERIALIZATION_NVP(name) \
{ int name = 0; } ; BOOST_SERIALIZATION_NVP(name)
int main(int argc, char *argv[])
{
int foo[3] = { 10, 20, 30 };
int bar = 10;
SAFE_BOOST_SERIALIZATION_NVP(foo[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我在对 的调用中替换foo[0]为,则编译时不会出现错误。barSAFE_BOOST_SERIALIZATION_NVP
| 归档时间: |
|
| 查看次数: |
5240 次 |
| 最近记录: |