c++ - JSON 或 Protocol Buffer 替换自定义 TCP 消息

标签 c++ json node.js protocol-buffers

原来,我们有两个使用TCP/IP通信的应用程序,它们都是用C++实现的。它们之间的消息是自定义消息类型。

enter image description here

现在客户端程序将改为基于nodejs的web应用,它们之间的通信将改为rabbitmq等消息总线

enter image description here

所以他们之间的消息类型应该改变。

我首先想到的是

JSON,但是自定义消息太复杂了,由templateinheritance<定义。将自定义消息转换为 JSON 似乎不是一个好的选择。我说得对吗?

class Address {
    int network;
    int addressType;
    //...
};

class MsgType{
    unsigned char   msgSeq;
    unsigned int    msgLen;
    //...
};

class Message{
    Address destination;
    Address source;
    MsgType msgType;

    //...
};

template <typename T, int RESPONSE_TYPE>
class ResponseMessage : public Message{
    //...
}

typedef struct{
    int number;
    int type;
}ConfigResp;

class CfgResp : public ResponseMessage<ConfigResp, CONFIG_REQUEST>
{
    //...
}

Protocol Buffers 是我执行此操作的另一种选择。我应该怎么办? 将自定义消息重新定义到 Protocol Buffer 中?不不

这是我的解决方案:只需将整个原始自定义消息(二进制类型)作为服务器端的一条消息包装到 Protocol Buffer 中,然后在客户端解码自定义消息(二进制类型)。这可能吗?

最佳答案

看起来您正在构建您的应用程序以变得更具可扩展性。不使用良好的消息格式完全违背了这一目标。

不要将二进制格式嵌入 Protocol Buffer block 中。您将一无所获 - 您需要为每个想要使用消息总线的组件重写解析和编写代码。那是浪费时间和精力。

将您的 C++ 结构映射到 JSON 或 Protocol Buffer 很痛苦。但这将使以后使用 node.js 或其他可以窥视消息总线的东西更容易地挂接这些消息。

我个人会使用 Protocol Buffer ——因为它们的类型更安全。并且在 JSON 库中处理各种类型之间存在差异,因为 JSON 格式(有意)松散。特别是我发现处理长整数有问题。

通常我会为每个需要转换的类编写一个辅助模板结构——然后转换就变成了很多样板文件。有点像

template<typename T> class ProtocolBufferHelper {
}

template<> class ProtocolBufferHelper<Address> {
  typedef address_buffer protocol_buffer_type;
  void writeToProtocolBuffer( const Address &a, address_buffer & buffer) {
    buffer.setNetwork(a.network);
    ...
  }
  ...
}

template<> class ProtocolBufferHelper<Message> {
  void writeToProtocolBuffer(  const Message &m, address_buffer & buffer) {
    ::writeToProtocolBuffer(buffer.getDestination(), m.destination);
    ::writeToProtocolBuffer(buffer.getSource(), m.source);
    ...
  }
}

template<typename T> void writeToProtocolBuffer( const T &value, ProtocolBufferHelper<T>::protocol_buffer_type & buffer ) {
   ProtocolBufferHelper<T>::writeToProtocolBuffer(value, buffer);
}

请原谅我不记得 C++ 中 Protocol Buffer 语法的确切内容(已经有一段时间了……)。但希望它足以让你开始。

关于c++ - JSON 或 Protocol Buffer 替换自定义 TCP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28083112/

相关文章:

javascript - 将 Node 流转换为 Rx.js Observables

c++从类外部调用方法

c++ - Macports cgal 不工作!我如何解决它?

python - simplejson:加载西类牙字符——utf-8

json - 你如何让 Jackson 使用 Kotlin 默认参数作为缺失值?

node.js:DynamoDB DocumentClient 返回空对象

c++ - static_cast<const A>(*this) 和 static_cast<const A&>(*this) 的区别

c++ - Kinect 骨骼关节提取库

python - 替换我的功能的更好方法?

javascript - 如何在静态 Javascript 中嵌入 EJS 代码?