Если ваш класс сериализации знает, как обрабатывать std::vector<std::string>
(вы должны протестировать его со строками разных размеров), он также может знать, как обрабатывать CString
(версия с широким типом символов), рассматривая его как двоичные данные, предполагая, что файлоткрывается в двоичном формате.
Эти флаги необходимы для открытия в двоичном режиме в Windows:
std::ofstream file("out.txt", std::ios::binary);
std::ifstream file("out.txt", std::ios::binary);
Если класс сериализации использует текстовые файлы для хранения, то не используйте двоичный режим,прочитайте следующую строку:
В качестве альтернативы, вы можете конвертировать CString
(UTF16) в UTF8
std::vector<std::string> vec;
vec.push_back((const char*)CW2A(L"abc-unicode-ελληνική", CP_UTF8));
Вам придется конвертировать обратно в CString
, как только вы прочитаете его из архива:
CString s = CA2W(vec[0].c_str(), CP_UTF8);
В двоичном формате используйте правильный размер для сохранения
CString
.Что-то вроде:
CEREAL_SAVE_FUNCTION_NAME...
size_type size = (str.GetLength() + 1) * sizeof(TCHAR);
ar(size);
ar(binary_data(str.GetBuffer(), size));
str.ReleaseBuffer();
При чтении в CString
, убедитесь, что буфер достаточно большой, вызвав str.GetBuffer(size)
вместо str.GetBuffer()
Код должен выглядеть примерно так:
CEREAL_LOAD_FUNCTION_NAME...
size_type size;
ar(size);
ar(binary_data(str.GetBuffer(size), size);
str.ReleaseBuffer();
Чтобы сериализовать векторы, сохраните размер вектора, затем сохраните каждый элемент вектора.Чтобы прочитать векторное измерение, а затем прочитать, что много элементов из архива.Если ваш класс сериализации не имеет автоматизации для этого.