简体   繁体   中英

What's the clue to make stringstream write binary?

What I'm trying to do is, make the class message serialize and deserialize it's self. Not into or from a file, but into or from a binary sequence as a string or cstring.

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;
}

Output:

Msg: 0 Client: 12345 Data: some data

Msg: 1 Client: 12346 Data: some other data

Msg: 0 Client: 12345 Data: some data

Msg: 1 Client: 12346 Data: some other data

Any suggestions? Greetings Mesha

What I'm trying to do is, make the class message serialize and deserialize it's self. Not in or from a file, but in / from a string.

well you should probably take a look into XML then....

Generally you serialize an object by serializing all it's data-members. Hence this will not work as expected:

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

This does not serialize data dynamically allocated data.

If you have a lot of serialization/deserialization to do, take a look at Boost.Serialization . Even if you do not want to use it, reading the docs can give you some good understanding on how this is done.

If guess correctly, your code is intended to check if the serialization works as intended. This would be better achieved by passing the stream you want to serialize to as a parameter to the serialization-method:

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

Also, you should use str::string for strings, not const char * .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM