协议实现的数据序列化
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 会划界。
如果您坚持使用逐字节定义的协议,正如您所展示的那样,将很难找到有效匹配的序列化技术。您可能会被迫自己编写所有代码。
我要实现一个通信协议。协议中使用的数据结构定义为每个消息中每个字段的字节数
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 会划界。
如果您坚持使用逐字节定义的协议,正如您所展示的那样,将很难找到有效匹配的序列化技术。您可能会被迫自己编写所有代码。