2012-06-20 3 views
3

Это действительно легко сериализовать C++ объект в файл с усилением,Как сериализоваться в необработанный блок памяти?

std::ofstream ofile(lpszFileName); 
boost::archive::text_oarchive oa(ofile); 
oa << m_rgPoints; 

Но как я мог сериализовать C++ объект в сырьевой блок памяти?

Должен ли я читать поток выходного файла в память или есть ли другой лучший метод?

Спасибо.

ответ

3

Вы можете написать собственный streambuf класс, что работает непосредственно на память:

class membuf : public std::streambuf 
{ 
public: 
    membuf(char * mem, size_t size) 
    { 
    this->setp(mem, mem + size); 
    this->setg(mem, 0, mem + size); 
    } 
    int_type overflow(int_type charval = traits_type::eof()) 
    { 
    return traits_type::eof(); 
    } 
    int_type underflow(void) 
    { 
    return traits_type::eof(); 
    } 
    int sync(void) 
    { 
    return 0; 
    } 
}; 

Используйте этот класс:

membuf buf(address,size); 
    ostream os(&buf); 
    istream is(&buf); 

    oss << "Write to the buffer"; 
+0

Это было бы еще шире, если бы вам не нужно было заранее указывать размер буфера. Но, возможно, вопрос подразумевает это как требование. –

0

Если я понимаю, вам нужна двоичная сериализация boost::archive::binary_oarchive. Затем вы можете копировать данные из потока.

4

Отредактированный в ответ на комментарии Джеймса Kanze:

Вы можете сериализовать в std::ostringstream:

std::ostringstream oss; 
boost::archive::text_oarchive oa(oss); 
oa << m_rgPoints; 

А потом читать, что, получив std::streambuf (вызов oss.rdbuf()) и вызова streambuf::sgetn на что для чтения данных в ваш собственный буфер.

http://www.cplusplus.com/reference/iostream/ostringstream/rdbuf/

Это позволяет избежать ненужных временных файлов.

+0

Только для записи: 'ios_base :: binary' флаг игнорируется по 'stringbuf'; это действительно актуально для 'filebuf' (' ifstream', 'ofstream'). И так как вы просто пишете, не будет более подходящим «ostringstream». –

+0

Я не понимал, что двоичный файл имеет значение только для filebuf. Спасибо за это, и, конечно же, устричный поток будет более уместным. –

Смежные вопросы