2011-06-02 61 views
8

我想序列化一個類使用boost序列化庫的字符串,並在我的課程中包含幾個雙成員變量。boost序列化和雙打

下面是代碼我使用序列化:

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/string.hpp> 

std::stringstream ss; 
boost::archive::text_oarchive oa(ss); 
oa << mPoint; 

這裏是我的Point類中的方法serialiation:

friend class boost::serialization::access; 

template<class Archive> 
void serialize(Archive & ar, const unsigned int version) 
{ 
    if (version > 0) 
    { 
     ar & mLatitude; 
     ar & mLongitude; 
    } 
} 

當我序列化到一個字符串,升壓不似乎可以像我所期望的那樣處理雙重字符串轉換(這似乎是四捨五入的問題)。研究一下它看起來像其他人報道了相同的行爲。我也理解與將double轉換爲字符串相關的精度相關問題,以及如何導致問題。

什麼是奇怪的,我不明白,雖然這似乎並沒有發生,當我使用stringstream本身和重定向雙流到流,或者當我使用boost的lexical_cast函數從stringstream轉換。 str()返回一個double。在發現boost有它自己的序列化/反序列化類之前,我實際上使用stringstream和lexical_cast調用編寫了自己的代碼,並且它沒有問題。我真的希望我不必放棄序列化庫,回到以前的版本。希望有一些設置/特徵/等。我丟了。

+0

明顯的和愚蠢的建議是序列化的二進制數據,而不是作爲一個字符串?也許這是解決方案?再一次,如果這很容易,你可能會做到這一點...... :)如果沒有答案和我的好奇心找出解決方案,我不會提供我的建議。 :) – NoSenseEtAl 2011-06-03 22:36:15

+0

boost的lexical_cast具有相當複雜的邏輯來設置流的精確度 - 請參閱http://www.boost.org/doc/libs/1_46_1/boost/detail/lcast_precision.hpp – 2011-06-05 15:51:31

+0

您可以舉一個例子做和不做正確的往返? – 2011-06-05 16:22:22

回答

2

你可以嘗試連載到它之前迫使你的流用科學的格式浮點:

ss << std::scientific; 

它看起來像boost庫正確設置的精度,但不會出現設置格式。或者,您可以推導並覆蓋保存和/或加載浮點數的邏輯,而不會丟棄庫的其餘部分 - 開始here

它也像有work in progress扶持無窮等​​

+0

我也修改了類來表示我的數據元素爲float,而不是double,它看起來也是這樣做的,至少解決了序列化問題。 – 2011-06-13 17:57:54