views:

99

answers:

2

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

A: 

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....

YeenFei
xml is heavy and hard to get right, there are other solutions for marshalling to strings, especially if you don't need to store hierarchies or if you have memory requirements. You could have mentioned json too.
Alexandre C.
xml is a file format. I don't want to read write files.
Mesha
XML isn't restricted to files.
Johnsyweb
@Mesha, XML is a data format that is not implicitly tied to file storage.
Amardeep
I agree, anyway i don't want to use xml.
Mesha
@Alexandre, xml is not hard and serve well as "string-representable" data format.
YeenFei
A: 

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 *.

Space_C0wb0y
There aren't any checks yet. See edit the structure of message is pretty simple. I only intend to stream from object to a binary sequence (c-string or string) and vice versa. You're right there will be some more de-/serialization, its better to pass a stream.
Mesha