Прямое ускорение сериализации в массив символов - PullRequest
20 голосов
/ 10 июня 2010

Ускорение документирования сериализации утверждает, что способ сериализации / десериализации элементов заключается в использовании двоичного / текстового архива с потоком в базовой структуре. Это прекрасно работает, если я не хочу использовать сериализованные данные в качестве std :: string, но я намерен преобразовать их непосредственно в буфер char *. Как я могу добиться этого без создания временной строки?

Решено! Для тех, кто хотел пример:

char buffer[4096];

boost::iostreams::basic_array_sink<char> sr(buffer, buffer_size);  
boost::iostreams::stream< boost::iostreams::basic_array_sink<char> > source(sr);

boost::archive::binary_oarchive oa(source);

oa << serializable_object; 

Ответы [ 2 ]

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

Если вы не знаете размер данных, которые вы отправляете заранее, это общий способ сериализации в std::string:

// serialize obj into an std::string
std::string serial_str;
boost::iostreams::back_insert_device<std::string> inserter(serial_str);
boost::iostreams::stream<boost::iostreams::back_insert_device<std::string> > s(inserter);
boost::archive::binary_oarchive oa(s);

oa << obj;

// don't forget to flush the stream to finish writing into the buffer
s.flush();

// now you get to const char* with serial_str.data() or serial_str.c_str()

. Для десериализации используйте

* 1006.*

Это работает как талисман, я использую его для отправки данных с помощью MPI.

Это можно сделать очень быстро, если вы храните serial_str в памяти и просто вызываете serial_str.clear() перед вами.сериализовать в него.Это очищает данные, но не освобождает память, поэтому выделение не произойдет, если ваш следующий размер данных сериализации не требует этого.

6 голосов
/ 10 июня 2010

IIUC, вы хотите записать в предварительно выделенный массив фиксированного размера.

Вы можете использовать для этого boost :: iostreams :: array_sink (обернутый stream для предоставления ему интерфейса std :: ostream).

...