Увеличить сериализацию только первого символа std :: wstring - PullRequest
4 голосов
/ 10 апреля 2011

Я использую boost для сериализации с текстовым архивом переменной std :: wstring.Если я переключаюсь на std :: string, это работает очень хорошо, но когда я использую wstring, я получаю сериализованный только один символ.Почему?

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()

1 Ответ

10 голосов
/ 10 апреля 2011

Вы пытаетесь сериализовать строку широких символов в архив с узкими символами.Это приводит к тому, что последовательность байтов, содержащая вашу строку широких символов, интерпретируется как последовательность узких символов.Если принять во внимание, что символы ASCII занимают только один из байтов соответствующей кодировки широких символов, оставляя все остальные байты широких символов равными нулю, становится очевидным, что архив узких символов останавливается после просмотра первого символа (когда он достигает нулевого байта (-ов) после кода символа 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;

, он будет работать как положено.

...