如何序列化一个对象通过networking发送

我想通过套接字使用STL序列化对象通过networking发送。 我没有find一种方法来保持对象的结构在其他主机反序列化。 我试图转换为string ,以char* ,我花了很长时间在互联网上search教程,直到现在,我什么都没有find。

有没有办法做到这一点只有STL?

有没有好的教程?

我几乎试图提高,但如果有如何与STL做,我想学习。

Solutions Collecting From Web of "如何序列化一个对象通过networking发送"

你可以用任何东西来序列化。 所有的序列化意味着你正在将对象转换为字节,以便你可以通过一个流发送它(像一个std::ostream ),并阅读与另一个(如std::istream )。 只要覆盖operator <<(std::ostream&, const T&)operator >>(std::istream&, T&) ,其中T是您的每个类型。 和你的类型中包含的所有类型。

不过,你应该使用一个已经存在的库(Boost非常好)。 像Boost这样的库有很多东西,比如字节顺序,照顾常见对象(如数组和所有标准库中的东西),提供一致的方式来执行序列化和其他东西。

我的第一个问题是:你想要序列化还是消息传递?

起初可能看起来很蠢,因为你要求序列化,但是我一直把这两个术语区分开来。

  • 序列化是关于记忆你的记忆并在稍后恢复。 每个对象都被表示为一个独立的实体(尽管它们可能被组成)
  • 消息传递是将信息从一个点发送到另一个点。 该消息通常有其自己的语法,可能不反映您的业务模型的组织。

我经常见到使用序列化的人应该使用消息。 这并不意味着序列化是无用的,但这确实意味着你应该提前思考。 一旦你决定序列化它,特别是如果你决定重新部署信息的某一部分(将它从一个对象移到另一个对象)时,改变BOM是相当困难的…因为你怎样才能解码“旧”序列化版本?

现在已经清除了

…我会推荐Google的协议缓冲区。

你可以使用STL完全重写你自己,但是你最终会做已经完成的工作,除非你想从中学习,否则这是毫无意义的。

关于protobuf一个protobuf就是它的语言是不可知的,也就是说,你可以为C ++,Java或者Python生成给定消息的编码器/解码器。 Python的使用非常适合消息注入(测试)或消息解码(检查记录消息的输出)。 如果你使用STL,这不是一件容易的事情。

通过网络套接字序列化C ++对象

这是迟了6年,但我最近有这个问题,这是我在我的搜索如何通过在C ++网络套接字序列化对象遇到的线程之一。 该解决方案仅使用2或3行代码。 有很多答案我找到了工作,但我发现最简单的方法是使用reinterpret_cast<obj*>(target)将类或结构转换为字符数组,并通过套接字提供。 这是一个例子。

要序列化的类:

 /* myclass.h */ #ifndef MYCLASS_H #define MYCLASS_H class MyClass { public: int A; int B; MyClass(){A=1;B=2;} ~MyClass(){} }; #endif 

服务器程序:

 /* server.cpp */ #include "myclass.h" int main (int argc, char** argv) { // Open socket connection. // ... // Loop continuously until terminated. while(1) { // Read serialized data from socket. char buf[sizeof(MyClass)]; read(newsockfd,buf, sizeof(MyClass)); MyClass *msg = reinterpret_cast<MyClass*>(buf); std::cout << "A = " << std::to_string(msg->A) << std::endl; std::cout << "B = " << std::to_string(msg->B) << std::endl; } // Close socket connection. // ... return 0; } 

客户程序:

 /* client.cpp */ #include "myClass.h" int main(int argc, char *argv[]) { // Open socket connection. // ... while(1) { printf("Please enter the message: "); bzero(buffer,256); fgets(buffer,255,stdin); MyClass msg; msg.A = 1; msg.B = 2; // Write serialized data to socket. char* tmp = reinterpret_cast<char*>(&msg); write(sockfd,tmp, sizeof(MyClass)); } // Close socket connection. // ... return 0; } 

使用g++-std=c++11作为选项编译server.cppclient.cpp 。 然后可以打开两个终端并运行这两个程序,但是,在客户端之前启动服务器程序,以便它可以连接到某个程序。

希望这可以帮助。

我知道了!

我使用strictstream序列化对象,并使用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; oa = 1; ob = 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 } 

我不知道是否有必要转换为字符串之前序列化(ss << o),也许是可能的直接从字符。

我认为你应该在你的项目中使用谷歌协议缓冲区。在网络传输协议缓冲区有很多优点比序列化结构化数据的XML。 协议缓冲区:

更简单的是3到10倍小20到100倍更少模糊生成更容易使用的数据访问类programmaticall

等等。 我想你需要阅读关于protobuf的https://developers.google.com/protocol-buffers/docs/overview