tinyxml2中SetBoolSerialization设置未生效,为何XML仍为1/0?
问题解答:tinyxml2 SetBoolSerialization设置未生效的原因
你的猜测完全正确——问题就出在两次SetBoolSerialization调用的全局覆盖特性上。
核心原因分析
从你贴的函数定义能推断出,writeBoolTrue和writeBoolFalse是类的全局静态成员变量。SetBoolSerialization的作用是直接修改这两个全局静态值,而且没有任何“临时生效”或者“作用域隔离”的机制。
你的代码执行逻辑存在时序问题:
- 先将全局布尔序列化值设为
"true"/"false" - 执行XML创建操作,但tinyxml2的属性序列化逻辑(尤其是写入文件)并非实时执行,通常是在调用
SaveFile()时才会一次性处理所有属性的格式转换 - 你紧接着又把全局值改回
"1"/"0",导致最终执行序列化时,使用的是最后一次设置的"1"/"0",而非之前的"true"/"false"
解决方案
方案1:调整代码执行顺序
确保在XML完全保存完成后,再修改全局序列化设置:
tinyxml2::XMLUtil::SetBoolSerialization("true", "false"); // 完成所有XML创建、修改操作 tinyxml2::XMLError err = doc.SaveFile("your_target_file.xml"); // 确认保存完成后再恢复全局设置 tinyxml2::XMLUtil::SetBoolSerialization("1", "0");
方案2:使用显式字符串赋值(不受全局设置影响)
就是你提到的直接通过三元运算符指定属性值,这种方式完全独立于全局设置,适合局部需要特殊布尔格式的场景:
eventDateTime->SetAttribute("AllDayEvent", event.bEventAllDay ? "true" : "false");
方案3:临时保存并恢复全局设置
如果需要频繁切换全局序列化规则,可以先保存当前全局值,用完后再恢复:
// 保存当前全局布尔序列化设置 const char* oldTrue = tinyxml2::XMLUtil::writeBoolTrue; const char* oldFalse = tinyxml2::XMLUtil::writeBoolFalse; // 设置临时规则并执行XML保存操作 tinyxml2::XMLUtil::SetBoolSerialization("true", "false"); doc.SaveFile("your_target_file.xml"); // 恢复原有全局设置 tinyxml2::XMLUtil::SetBoolSerialization(oldTrue, oldFalse);
注意:如果
writeBoolTrue和writeBoolFalse是私有成员,你可能需要修改tinyxml2源码或通过反射方式访问,这种方式不如前两种稳妥。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

