В чем ключ, чтобы заставить stringstream записывать двоичный файл? - PullRequest
0 голосов
/ 15 июля 2010

То, что я пытаюсь сделать, это заставить сериализованное сообщение класса и десериализовать его самостоятельно. Не в файл или из файла, а в двоичную последовательность или из нее в виде строки или строки.

Message.h:

class Message
{
private:
    int message_id;
    int sender_id;

    std::string sender_data;

    Message ();

public:

    Message (int id, std::string data);
    virtual ~Message ();

    virtual const char* Serialize ();
    virtual void Deserialize (const char* buf);

    virtual void Print ();
};

message.cpp:

const char* Message::Serialize ()
{
    char buf[1024];

// This will work somehow. I get the object and then glibc 
// detects double free or corruption, because i write into buf 
// and not into a file.
//    std::ofstream out_stream(buf, std::ios::binary);
//    out_stream.write((char *)this, sizeof(*this));
//    out_stream.close();

//  Why this won't work? I didn't get it.
    std::stringstream out_stream(buf, std::ios::binary);
    out_stream.write((char *)this, sizeof(*this));

    std::string str(buf);

    std::cout << str << std::endl
              << buf << std::endl;

    return str.c_str();
}

void Message::Deserialize (const char* buf)
{
    std::ifstream in_stream(buf, std::ios::binary);
    in_stream.read((char*)this, sizeof(*this));
    in_stream.close();
}

Main:

#include "Message.h"

int main (int argc, int argv[])
{
    Message msg1(12345, "some data");
    Message msg2(12346, "some other data");

    msg1.Print();
    msg2.Print();

    msg2.Deserialize(msg1.Serialize());

    msg1.Print();
    msg2.Print();

    return 0;
}

Выход:

Сообщение: 0 Клиент: 12345 Данные: некоторые данные

Сообщение: 1 Клиент: 12346 Данные: некоторые другие данные

Сообщение: 0 Клиент: 12345 Данные: некоторые данные

Сообщение: 1 Клиент: 12346 Данные: некоторые другие данные

Есть предложения? Привет Меша

Ответы [ 2 ]

0 голосов
/ 15 июля 2010

Обычно вы сериализуете объект путем сериализации всех его элементов данных. Следовательно, это не будет работать так, как ожидалось:

out_stream.write((char *)this, sizeof(*this));

Не сериализует данные, динамически распределяемые данные.

Если вам нужно выполнить сериализацию / десериализацию, взгляните на Boost.Serialization . Даже если вы не хотите его использовать, чтение документов может дать вам хорошее понимание того, как это делается.

Если вы правильно догадались, ваш код предназначен для проверки того, работает ли сериализация так, как задумано. Этого лучше достичь, передав поток, который вы хотите сериализовать, в качестве параметра метода сериализации:

std::string Message::Serialize(ostream & sink);

Кроме того, вы должны использовать str::string для строк, а не const char *.

0 голосов
/ 15 июля 2010

Я пытаюсь сделать сообщение класса сериализуется и десериализовать себя. Не в или из файл, но в / из строки.

ну, наверное, вам стоит взглянуть на XML тогда ....

...