Ускорьте сериализацию только первого символа std::wstring

Я использую 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()

person Stefano    schedule 09.04.2011    source источник
comment
Вы можете попытаться скомпилировать этот пример: groups. google.com/group/boost-list/browse_thread/thread/   -  person Yippie-Ki-Yay    schedule 10.04.2011
comment
Лично я не уверен, как text_oarchive работает с wstrings.   -  person Yippie-Ki-Yay    schedule 10.04.2011


Ответы (1)


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

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

person hkaiser    schedule 09.04.2011