C++ 什么';让stringstream写二进制的线索是什么?
我想做的是,让类消息序列化并反序列化它自己。不是从文件中输入或输出,而是作为字符串或字符串从二进制序列中输入或输出 信息h: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 ();
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);