4

ブーストを使用して、テキストアーカイブでstd::wstring変数をシリアル化します。std :: stringに切り替えると非常にうまく機能しますが、wstringを使用すると、1文字しかシリアル化されません。なんで?

std::wstring text;

template<class Archive> void serialize(Archive &ar, const unsigned int version)
{
    ar & text;
}

...

std::ostringstream stream;

boost::archive::text_oarchive archive(stream);

archive << params;

...

stream.str()
4

1 に答える 1

10

幅の広い文字列を幅の狭い文字アーカイブでシリアル化しようとしています。これにより、ワイド文字列を構成するバイトシーケンスがナロー文字のシーケンスとして解釈されます。ASCII文字が対応するワイド文字エンコーディングのバイトの1つだけを占め、ワイド文字の他のすべてのバイトをゼロに設定したままにすることを考慮すると、最初の文字を見た後にナロー文字アーカイブが停止することが明らかになります( ASCII文字コードに続くゼロバイトにヒットするため)。

コードを次のように変更した場合:

std::wstring text;

template<class Archive> 
void serialize(Archive &ar, const unsigned int version)
{ 
    ar & text; 
}

std::wstringstream stream;
boost::archive::text_woarchive archive(stream);
archive << params;

期待どおりに動作します。

于 2011-04-09T22:08:07.770 に答える