我需要创建与 C++ 客户端和 Python 服务器(已经启动)的 TCP 聊天,我在 C++ 类中有消息,例如
class Message{
public:
uint64 utc_time;
uint64 token;
string content;
};
我正在将此从客户端发送到服务器,在服务器上我有 utc_time 的优先级队列并且需要广播给其他人。我的问题是如何序列化它,使用哪种格式来避免对大小类型大小的任何跨语言依赖? (也许将来会有更多的元数据,所以需要有点通用)?谁能给我建议使用哪种格式进行序列化(或仅像字节一样刷新)?
class Persistent:
public:
Persistent(int sz):objSize(sz){}
void write(std::ostream& out)const{out.write((char*)this, objSize);}
void read(std::istream& in){in.read((char*)this, objSize);}
private:
int objSize;
};
我想到了在服务器上用 C++ 编写反序列化器并从 Python 调用的其他可能性(如果可能的话)。这个问题有什么优雅的解决方案吗?
最佳答案
如果您真的想跨语言和跨平台而不必担心消息在哪里结束,请查看 Google Protobuf 的组合和 ZeroMQ .
当使用常规套接字时,您首先会读取消息的大小(您会在前面加上这个),然后您会知道字节数组从哪里到哪里是一条完整的消息。
示例 protobuf + zmq 用法:
message Message {
optional uint64 utc_time = 1;
required uint64 token = 2;
optional string content = 3;
}
使用 protobuf 编译器生成 C++ 代码(或 ruby/python/等)。
在您的代码中使用它:
#include <Message.pb.h>
Message msg;
msg.set_token(1);
msg.set_content("Hello world");
使用 zmq 发送:
std::string serialized = msg.SerializeAsString();
zmq::message_t reply(serialized.size());
memcpy(reply.data(), serialized.data(), serialized.size());
zmq_socket.send(reply);
使用 zmq 接收它:
zmq::message_t request;
zmq_socket.recv(&request); // blocking
Message recv_msg;
recv_msg.ParseFromArray(request.data(), request.size());
关于c++ - 如何在使用 TCP 的序列化/反序列化中避免跨语言依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713153/