在长度前缀后反序列化来自 TCP 接收的结构
问题:
反序列化自定义时通过 TCP 从单独的机器接收结构体时,遇到异常: “System.Runtime.InteropServices.SafeArrayTypeMismatchException”。
原始实现:
该结构包括用于在发送之前和之后准备和检索数据的序列化方法。发送的字节中会添加一个标头,以指示传入数据的大小,格式为“l=xxxx;”。接收端搜索此标头,提取数据包字节,并尝试反序列化它们。
异常原因:
根本原因在于依赖于用于确定数据包长度的字符串。这种方法可能会导致通过网络传输数据时出现不一致。
解决方案:
实现长度前缀:
不要使用标头字符串,而是实施适当的长度前缀。这涉及到向发送的每个“数据包”添加固定标头,表示数据的长度。该长度转换为字节,结果为 4 个字节。然后附加数据头和数据包本身。
数据包结构:
[长度(4 字节)][标头(1 字节)][数据(x byte(s))]
数据包接收和解析:
以上是如何从长度前缀的 TCP 流中可靠地反序列化结构?的详细内容。更多信息请关注PHP中文网其他相关文章!