2011-07-20 49 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