粗略地说,我有一个对象 o
和一个指向该对象 po = &o
的指针,我将其序列化如下:
// Somewhere
ar & o;
// Somewhere else, but after somewhere
ar & po;
当序列化po
时,Boost.Serialization应该发现它已经序列化了o
并且不再序列化*po
。我遇到了一种情况,库无法发现这种情况,而是序列化 o
两次。
不幸的是,在一个简单的示例中重现此行为的所有尝试都失败了,并且原始代码太大,无法在此处发布。因此,我不是要求问题的解决方案,而是要求一个指向 Boost.Serialization 中相关代码部分的指针,该代码部分跟踪地址并确定指针是否需要“深度”序列化。我希望我可以自己进行调试。
当然,任何关于错误可能是什么的最佳猜测也是受欢迎的,但我不想让你的 Crystal 球承受太大的压力。 ;-)
顺便说一句,如果相关的话,我会使用 boost::archive::text_oarchive
。
最佳答案
有问题的代码部分是 basic_oarchive 中的 save_pointer()
函数。
Boost.Serialization 使用两个特征来检查对象是否已被序列化:对象地址和对象类型。地址部分是显而易见的,如果你仔细想想,类型部分也是有意义的。我的问题是我没有考虑这个问题,只是检查了有问题的两个地址是否相同。这确实是正确的,但由于类型不同,序列化库假设它是两个不同的对象。
关于c++ - 调试 Boost.Serialization 地址跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26712236/