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

Serialization 用于协议实现的数据序列化,serialization,protocols,code-generation,Serialization,Protocols,Code Generation,我要实现一个通信协议。协议中使用的数据结构定义为每条消息中每个字段的字节数 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 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不是问题,因为使用的变量类型更改了序列化的数据。 类似的库也存在,但我不确定它们是否可以用于此目的(flat buffers,cap'n proto)

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


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

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

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

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


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

是的,我想您是对的,我将自己编写所有代码,而不是使用某种序列化工具。我将告诉我们e GSL()并尽可能多地生成。无论如何,谢谢。:)