c++ - 如何在使用 TCP 的序列化/反序列化中避免跨语言依赖?

标签 c++ python algorithm tcp protocols

我需要创建与 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/

相关文章:

c - 最快的子串搜索算法是什么?

java - 输出数组中顺序错误的对数?

c++ - 令人困惑的模板代码

c++ - 与 QProcess 交互的问题

python - Tensorflow 线性回归结果与 Numpy/SciKit-Learn 不匹配

python - 当我的共享库由 icc -O3 或 -O2 优化并通过 Python ctypes 使用时,会发生段错误

c++ - 由另一个数组中的值组成的数组

c++ - 错误: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'List' )

python - 如何获取新列中的所有唯一值

礼品卡代码算法