2011-07-20 47 views
2

我無法使用boost::serialization,因爲它具有庫依賴性,所以我試圖找出一種方法來自己做。這並不重要,這意味着從boost::serialization複製。如何加載序列化的boost :: variant?

看完this answer to a similar question之後,我看了一下boost/serialization/variant.hpp,發現save()這個功能對我來說是直接的和可以理解的。

然而load()功能看起來比較複雜:有涉及load()variant_impl<types>::load()和遞減which參數遞歸。 顯然,代碼會遍歷每種類型的變體,以便將int which轉換爲類型。 其餘的超越了我。

我知道增強有很多代碼,使它可移植,所以也許有一個不太便攜但更容易的方法來做到這一點?

回答

1

如果您要從boost/serialization/variant.hpp(除了Archive模板參數)副本中刪除序列化內容 - 即拋出您自己的異常類型並更改例如

ar >> BOOST_SERIALIZATION_NVP(which); 
// to: 
ar >> which; 

那麼它看起來像你應該能夠使用的std :: ostream的或std :: istream的在保存/加載函數分別替換存檔。

沒有嘗試過,但一目瞭然,它看起來應該工作。

我想這取決於你實際使用的序列化數據,如果不使用boots :: serialization?

+0

我想把我的數據放入一個MFC'CArchive'對象中......我嘗試刪除NVP的東西,但是'CArchive'似乎不適合所有這些.. – foraidt

+0

@foraidt: 'CArchive'僅適用於從'CObject'派生的類型,'boost :: variant <>'顯然不適用。 – ildjarn

+0

@ildjarn CArchive :: operator <<()'被重載了相當多的類型(請參閱http://msdn.microsoft.com/en-us/library/331a7zh8%28v=vs.80%29.aspx) 。這允許序列化比'CObject'派生的類多得多。我的目標是序列化不是'variant'本身,而是它包含的數據。 – foraidt