8

Boostシリアル化ライブラリを使用してクラスを文字列にシリアル化しようとしていますが、クラスにはいくつかのdoubleメンバー変数が含まれています。

以下は、シリアル化に使用しているコードです。

#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クラス内のシリアル化メソッドです。

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自体を使用してdoubleをストリームにリダイレクトしたり、boostのlexical_cast関数を使用してstringstream.str()から変換したりすると、これは発生しないようです。ダブルに。boostが独自のシリアル化/逆シリアル化クラスを持っていることを発見する前に、私は実際にstringstreamおよびlexical_cast呼び出しを使用して独自のクラスを作成しましたが、問題なく機能しました。シリアル化ライブラリを放棄して、以前の状態に戻る必要がないことを本当に望んでいます。うまくいけば、いくつかの設定/特性などがあります。私は行方不明です。

4

2 に答える 2

2

ストリームにシリアル化する前に、浮動小数点に科学的形式を使用するようにストリームを強制することができます。

ss << std::scientific;

Boostライブラリが精度を正しく設定しているように見えますが、形式を設定しているようには見えません。あるいは、ライブラリの残りの部分を破棄せずに浮動小数点数を保存および/またはロードするためのロジックを導出してオーバーライドすると思うことができます-ここから始めてください。

また、無限大のサポートなどの作業が進行中のようです。

于 2011-06-05T16:21:55.283 に答える
0

これは質問に直接答えることはありませんBoost.Serializationが、考えられる回避策です。

上記の質問から、文字列表現が必要かどうかは私にはわかりません。クロスプラットフォーム表現(バイナリまたはその他)を探している場合はprotobuf、エンコーディングをサポートしているを使用することを検討してdoubleください。

http://code.google.com/apis/protocolbuffers/docs/proto.html#scalar

于 2011-06-04T17:12:52.417 に答える