首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于协议实现的数据序列化

用于协议实现的数据序列化
EN

Stack Overflow用户
提问于 2020-02-21 06:18:14
回答 1查看 68关注 0票数 0

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

代码语言:javascript
运行
复制
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不受欢迎,因为所使用的变体类型会更改序列化的数据。类似的库存在,但我不确定它们是否可以用于此用途(平面缓冲区,帽‘n proto)。

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

或者,你对此建议的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-21 20:46:06

通过定义每个字节意味着什么来定义协议中使用的消息,嗯,是老式的。尽管如此,许多现有的协议都是这样定义的。

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

该模式将在您的示例中定义“有效负载”字节的内容,您将把它留给GPB或其他任何东西来解决如何为您传递消息类型、大小和长度。在这方面,不同的序列化技术具有不同的功能。在GPB中,您可以使用oneof结构将想要发送的所有不同类型的内容合并到单个结构中,但是GPB并没有在连接上区分不同的消息(您必须自己添加,也许可以使用ZeroMQ发送消息)。几种ASN.1线格式确实在不同的消息之间划分,省去了麻烦(在原始流连接上很有用)。XML也被标定。我不认为普罗托上尉会分界。

如果您坚持按照定义的逐字节的协议(正如您已经展示的那样),就很难找到一种有用的匹配的序列化技术。你可能会被判自己写所有的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60333100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档