【问题标题】:Debug Boost.Serialization Address TrackingDebug Boost.Serialization 地址跟踪
【发布时间】:2014-12-29 23:46:51
【问题描述】:

粗略地说,我有一个对象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。

【问题讨论】:

  • 水晶球线 +1 :) 不,text_oarchive 不是很相关,尽管我发现 xml_oarchive 很适合了解跟踪参考。
  • BOOST_CLASS_TRACKING(Object, boost::serialization::track_always) 是否有帮助(如果只是为了突出冲突的特征)?
  • 不,它没有。不过还是非常感谢您的努力!

标签: c++ serialization boost boost-serialization


【解决方案1】:

您所做的假设是 Boost 序列化跟踪引用上的实例。这是一个错误的假设。

AFAIR 它跟踪指针(和智能指针)上的实例。

类似的事情也适用于多态类的运行时动态类型。

【讨论】:

  • a) 在我尝试过的所有情况下,跟踪工作(即只有一个序列化),例如如果您使用ar & o & po; 或它的任何变体。 b) pointer conflict 异常(参见boost.org/doc/libs/1_56_0/libs/serialization/doc/…)只有在引用也被跟踪时才有意义。因此,除非您向我展示明确证明您观点的文档摘录,否则我认为您的答案是错误的。
  • 嗯。 @gTcV 我必须同意这种解读。再说一次,对象跟踪非常棘手 (rereading this),所以在我们有 SSCCE 之前,恐怕它太难了。
【解决方案2】:

有问题的代码部分是basic_oarchive 中的save_pointer() 函数。

Boost.Serialization 使用两个特征来检查一个对象是否已经被序列化:对象地址和对象类型。地址部分很明显,如果您考虑类型部分也很有意义。我的问题是我没有没有考虑过,只是检查了两个有问题的地址是否相同。这确实成立,但由于类型不同,序列化库假定它是两个不同的对象。

【讨论】:

  • 呵呵呵呵。我几乎用 “类似的事情适用于多态类的运行时动态类型。” 给了你这个答案。但是我无法将这些点联系起来(它们超出了我的视野 :))。感谢发布决议。
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
相关资源
最近更新 更多