Luc*_*iza 8 c++ sockets linux serialization stream
我正在尝试序列化对象,通过仅使用STL的套接字通过网络发送.我没有找到一种方法来保持对象的结构在其他主机中反序列化.我试过转换到string,char*并且我花了很长时间在互联网上搜索教程,直到现在我什么都没发现.
有没有办法只用STL做到这一点?
有没有好的教程?
我差点尝试提升,但如果有STL怎么做我想学习.
你可以用任何东西序列化.所有序列化的意思是您将对象转换为字节,以便您可以通过流(如an std::ostream)发送它,并用另一个(如an std::istream)读取它.只是覆盖operator <<(std::ostream&, const T&)和operator >>(std::istream&, T&)其中T的每个类型.以及您的类型中包含的所有类型.
但是,你应该只使用一个已经存在的库(Boost非常好).像Boost这样的库为你做了很多事情,比如字节排序,处理常见对象(比如数组和标准库中的所有东西),提供了执行序列化和大量其他东西的一致方法.
我的第一个问题是:你想要序列化还是消息传递?
一开始看起来似乎很愚蠢,因为你要求序列化,但是我总是区分这两个术语.
我经常看到人们使用Serialization,其中应该使用Messaging.这并不意味着序列化是无用的,但它确实意味着你应该提前思考.一旦您决定对其进行序列化,就很难改变BOM,特别是如果您决定重新定位某些部分信息(将其从一个对象移动到另一个对象)...因为您将如何解码"旧"序列化版本?
现在已经清理了......
......我会推荐谷歌的协议缓冲区.
你可以使用STL完全重写你自己,但你最终会完成已经完成的工作,除非你想从中学习,否则它是毫无意义的.
一个很棒的事情protobuf是它在某种程度上与语言无关:即你可以为C++,Java或Python生成给定消息的编码器/解码器.Python的使用对于消息注入(测试)或消息解码(检查已记录消息的输出)很有用.如果您使用STL,这不是一件容易的事情.
我得到了它!
我使用 stringstream 来序列化对象,并使用 stringstream 的方法 str() 以及 string 的 c_str() 将其作为消息发送。
看。
class Object {
public:
int a;
string b;
void methodSample1 ();
void methosSample2 ();
friend ostream& operator<< (ostream& out, Object& object) {
out << object.a << " " << object.b; //The space (" ") is necessari for separete elements
return out;
}
friend istream& operator>> (istream& in, Object& object) {
in >> object.a;
in >> object.b;
return in;
}
};
/* Server side */
int main () {
Object o;
stringstream ss;
o.a = 1;
o.b = 2;
ss << o; //serialize
write (socket, ss.str().c_str(), 20); //send - the buffer size must be adjusted, it's a sample
}
/* Client side */
int main () {
Object o2;
stringstream ss2;
char buffer[20];
string temp;
read (socket, buffer, 20); //receive
temp.assign(buffer);
ss << temp;
ss >> o2; //unserialize
}
Run Code Online (Sandbox Code Playgroud)
我不确定是否有必要在序列化之前转换为字符串(ss << o),也许可以直接从 char 转换为字符串。
| 归档时间: |
|
| 查看次数: |
13511 次 |
| 最近记录: |