如何序列化通过网络发送的对象

Luc*_*iza 8 c++ sockets linux serialization stream

我正在尝试序列化对象,通过仅使用STL的套接字通过网络发送.我没有找到一种方法来保持对象的结构在其他主机中反序列化.我试过转换到string,char*并且我花了很长时间在互联网上搜索教程,直到现在我什么都没发现.

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

有没有好的教程?

我差点尝试提升,但如果有STL怎么做我想学习.

Tra*_*kel 7

你可以用任何东西序列化.所有序列化的意思是您将对象转换为字节,以便您可以通过流(如an std::ostream)发送它,并用另一个(如an std::istream)读取它.只是覆盖operator <<(std::ostream&, const T&)operator >>(std::istream&, T&)其中T的每个类型.以及您的类型中包含的所有类型.

但是,你应该只使用一个已经存在的库(Boost非常好).像Boost这样的库为你做了很多事情,比如字节排序,处理常见对象(比如数组和标准库中的所有东西),提供了执行序列化和大量其他东西的一致方法.

  • 这是多久以前的事?该库的当前**目标之一是:`数据可移植性 - 在一个平台上创建的字节流应该是可读的.所以我很确定. (3认同)

Mat*_* M. 5

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

一开始看起来似乎很愚蠢,因为你要求序列化,但是我总是区分这两个术语.

  • 序列化是关于记录内存的快照并在以后恢复它.每个对象都表示为一个单独的实体(尽管它们可能是由组成的)
  • 消息传递是指将信息从一个点发送到另一个点.该消息通常具有自己的语法,可能无法反映您的业务模型的组织.

我经常看到人们使用Serialization,其中应该使用Messaging.这并不意味着序列化是无用的,但它确实意味着你应该提前思考.一旦您决定对其进行序列化,就很难改变BOM,特别是如果您决定重新定位某些部分信息(将其从一个对象移动到另一个对象)...因为您将如何解码"旧"序列化版本?

现在已经清理了......

......我会推荐谷歌的协议缓冲区.

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

一个很棒的事情protobuf是它在某种程度上与语言无关:即你可以为C++,Java或Python生成给定消息的编码器/解码器.Python的使用对于消息注入(测试)或消息解码(检查已记录消息的输出)很有用.如果您使用STL,这不是一件容易的事情.


Luc*_*iza 0

我得到了它!

我使用 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 转换为字符串。