协议实现的数据序列化

Serialization of data for protocol implementation

我要实现一个通信协议。协议中使用的数据结构定义为每个消息中每个字段的字节数

bytes 1-2         -> stx bytes
bytes 3           -> mesg type
bytes 4-5         -> size of pay load
bytes 6-...       -> pay load bytes (unsigned bytes)
bytes ... - ...+1 -> checksum from byte 3 - ...
bytes ...+2       -> end byte

上面的示例是可变负载大小,但一些消息也是固定大小的。

为此,我检查了一个序列化库,即 "protocol buffers",但我得出结论,protobuf 不是投诉者,因为使用的变体类型会更改序列化的数据。 存在类似的库,但我不确定它们是否可以用于此目的(平面缓冲区,cap'n proto)。

那么,是否有一个框架来定义接口结构并为定义的接口生成适当的代码(数据结构+解析器+序列化器,如果可能支持多种语言) ?

或者您为此建议的最佳方法是什么?

通过定义每个字节的含义来定义协议中使用的消息是老式的做法。话虽如此,很多当前的协议都是这样定义的。

如果可以,最好从协议的架构开始(例如 Google 协议缓冲区的 .proto 文件,或 ASN.1 的 .asn 文件等。有很多可供选择),定义您要交换的消息,然后使用您选择的序列化技术工具(例如 protoc 用于 G.P.B,asn1c 用于 ASN.1,等)生成代码。

该架构将在您的示例中定义 "payload" 字节的内容,您可以将其留给 GPB 或其他任何机构来确定如何为您传达消息类型、大小和长度。不同的序列化技术在这方面有不同的能力。在 GPB 中,您将使用 oneof 结构将您要发送的所有不同类型的内容合并到一个结构中,但 GPB 不会在网络上的不同消息之间进行划分(您必须自己添加,也许通过使用 ZeroMQ 发送消息)。几种 ASN.1 有线格式确实在不同的消息之间进行了划分,从而节省了您的麻烦(在原始流连接上很有用)。 XML也划定了。我不认为 Cap'n Proto 会划界。

如果您坚持使用逐字节定义的协议,正如您所展示的那样,将很难找到有效匹配的序列化技术。您可能会被迫自己编写所有代码。