Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';让stringstream写二进制的线索是什么?_C++_Serialization_Binary_Stream - Fatal编程技术网

C++ 什么';让stringstream写二进制的线索是什么?

C++ 什么';让stringstream写二进制的线索是什么?,c++,serialization,binary,stream,C++,Serialization,Binary,Stream,我想做的是,让类消息序列化并反序列化它自己。不是从文件中输入或输出,而是作为字符串或字符串从二进制序列中输入或输出 信息h: class Message { private: int message_id; int sender_id; std::string sender_data; Message (); public: Message (int id, std::string data); virtual ~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();
}
输出:

消息:0客户端:12345数据:某些数据

消息:1客户端:12346数据:其他一些数据

消息:0客户端:12345数据:某些数据

消息:1客户端:12346数据:其他一些数据

有什么建议吗? 米沙,你好

我想做的是,让 类消息序列化和 反序列化它的自我。不在或不在 文件,但在字符串中/从字符串中


那么您可能应该研究一下XML….

一般来说,您可以通过序列化对象的所有数据成员来序列化对象。因此,这不会如预期那样起作用:

out_stream.write((char *)this, sizeof(*this));
这不会序列化动态分配的数据

如果要进行大量序列化/反序列化,请查看。即使您不想使用它,阅读文档也可以让您更好地理解如何使用它

如果猜测正确,则代码旨在检查序列化是否按预期工作。通过将要序列化的流作为参数传递给序列化方法,可以更好地实现这一点:

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

另外,您应该对字符串使用
str::string
,而不是
const char*

xml很重而且很难正确处理,还有其他用于编组到字符串的解决方案,特别是当您不需要存储层次结构或有内存需求时。你也可以提到json。XML不局限于文件。@Mesha,XML是一种数据格式,它不隐式地与文件存储绑定。我同意,无论如何,我不想使用XML。@Alexandre,XML并不难,可以作为“字符串可表示”的数据格式。将其转换为char*是未定义的行为,如果消息恰好是多态的,则会发生不好的事情。您使用的是虚拟函数…它生成存储在对象结构开头的虚拟函数表。目前还没有任何检查。请参见编辑消息的结构非常简单。我只打算从对象流到二进制序列(c字符串或字符串),反之亦然。你是对的,将会有更多的反序列化,传递流更好。
std::string Message::Serialize(ostream & sink);