【问题标题】:Serialization of data for protocol implementation用于协议实现的数据序列化
【发布时间】:2020-02-21 06:18:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: serialization protocols code-generation


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,我想你是对的,我应该自己编写所有代码,而不是使用一些序列化工具。我将使用 GSL (github.com/imatix/gsl) 并尝试尽可能多地生成。无论如何谢谢你。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多