粗略地说,我有一个对象o
和一个指向该对象po = &o
的指针,我按这样序列化:
// Somewhere
ar & o;
// Somewhere else, but after somewhere
ar & po;
在序列化po
时,Boost.Serialization会发现它已经序列化o
而不是再次序列化*po
。我有一种情况,即图书馆在发现这种情况时失败,而是将o
序列化两次。
不幸的是,在一个简单的例子中重现这种行为的所有尝试都失败了,并且原始代码太大而无法在此处发布。因此,我没有找到问题的解决方案,而是要求指向Boost.Serialization中相关代码部分的指针,该部分跟踪地址并确定指针是否需要深度"序列化与否。我希望我可以自己做调试。
当然,任何关于错误可能最好的猜测也是受欢迎的,但我不想过多地拉扯你的水晶球。 ; - )
顺便说一句,如果相关,我会使用boost::archive::text_oarchive
。
答案 0 :(得分:2)
相关代码部分是basic_oarchive中的save_pointer()
函数。
Boost.Serialization使用两个特性来检查对象是否已被序列化:对象地址和对象类型。地址部分很明显,如果你考虑类型部分也是有意义的。我的问题是我做了不考虑它,只检查了两个地址是否相同。这确实是正确的,但由于类型不同,序列化库假设它是两个不同的对象。
答案 1 :(得分:0)
您所做的假设是Boost Serialization跟踪引用上的实例。这是一个错误的假设。 击>
AFAIR它跟踪指针(和智能指针)上的实例。
击>
类似的东西适用于运行时动态类型的多态类。