2014-11-03 108 views
2

粗略地說,我有一個對象o和一個指向對象po = &o,這我序列是這樣的:調試Boost.Serialization地址跟蹤

// Somewhere 
ar & o; 

// Somewhere else, but after somewhere 
ar & po; 

當序列化po,Boost.Serialization應該發現它有已經序列化了o而不是再次序列化*po。我有一種情況,圖書館未能發現這種情況,而是連續兩次序列化o

不幸的是,在一個簡單示例中重現此行爲的所有嘗試均失敗,並且原始代碼太大而無法在此處發佈。因此,我不是問題的解決方案,而是要求指向Boost.Serialization中的相關代碼部分的指針,它跟蹤地址並確定指針是否需要「深度」序列化。我希望我可以自己做調試。

當然,任何有關錯誤可能的最佳猜測也是受歡迎的,但我不想讓你的水晶球過度疲勞。 ;-)

順便說一句,我用boost::archive::text_oarchive如果這是相關的。

+0

+1爲水晶球行:)否,'text_oarchive'不是很相關,雖然我發現'xml_oarchive'很適合獲得一些跟蹤引用的隱藏。 – sehe 2014-11-03 10:43:09

+0

'BOOST_CLASS_TRACKING(Object,boost :: serialization :: track_always)'help(如果只是爲了強調衝突特性)? – sehe 2014-11-03 11:06:38

+0

不,它沒有。但是,非常感謝您的努力,無論如何! – gTcV 2014-11-03 14:03:55

回答

2

問題的代碼段是basic_oarchive中的save_pointer()函數。

Boost.Serialization使用兩個特性來檢查對象是否已被序列化:對象地址和對象類型。地址部分是顯而易見的,如果你也考慮類型部分是有意義的。我的問題是,我做了而不是想一想,只檢查了兩個地址是否相同。這確實如此,但由於類型不同,序列化庫假定它是兩個不同的對象。

+0

呵呵呵。我差不多給了你這個答案 - 「類似的東西適用於運行時動態類型的多態類。」但我無法連接點(它們在我的視野之外:))。發佈決議的榮譽。 – sehe 2014-11-03 15:11:34

0

您做的假設是Boost Serialization跟蹤引用上的實例。這是一個錯誤的假設。

AFAIR它跟蹤指針(和智能指針)上的實例。

類似的東西適用於運行時動態類型的多態類。

+0

a)我試過的所有情況下的跟蹤工作(即只有一個序列化)如果你做'ar&o & po;'或者它的任何變種。 b)'指針衝突'異常(參見http://www.boost.org/doc/libs/1_56_0/libs/serialization/doc/exceptions.html#pointer_conflict)只有在跟蹤引用時纔有意義。因此,除非您向我展示明確證明您的觀點的文檔摘錄,否則我認爲您的答案是錯誤的。 – gTcV 2014-11-03 10:50:48

+0

嗯。 @gTcV我必須同意這個看法。然後再次,對象跟蹤相當棘手([重讀此](http://www.boost.org/doc/libs/1_56_0/libs/serialization/doc/special.html#objecttracking)),直到我們有一個SSCCE I恐怕太水晶了。 – sehe 2014-11-03 11:03:58