越过电线

Gob over the wire

我正在考虑使用 gob ("encoding/gob") 在网络协议中序列化数据,我一直在搜索,但似乎找不到解决这些问题的方法:

消息框架 - gob 文档给人的印象是您可以简单地将 TCP 连接包装在 gob 解码器中并读取。但是,如果您只收到半条消息会怎样? gob 能否以某种方式处理这个问题,或者我是否被迫添加一个消息帧并将消息数据复制到一个缓冲区中以供 gob 反序列化?

不同类型的消息 - 协议有不同类型的消息,如何最好地使用 gob 处理?通过在每个 gob blob 之前有一个标识符来指示数据类型?通过将所有消息放入 "Master" 消息中,该消息包含所有不同消息的字段(将其减少为仅一种类型的消息)? 我尝试了后者(更简单),它似乎有巨大的开销(>650 字节)。

The gob documentation gives the impression that you can simply wrap your TCP connection in a gob decoder and read away.

正确。该包旨在在编码器和解码器之间流式传输多个值。

But what happens if you only received half a message?

解码器调用底层io.Reader获取数据。如果reader不能return数据,那么reader会return一个错误。解码器 return 将此错误发送给应用程序。

如果 io.Reader return 出现错误,则无法恢复解码流。

Different types of messages

您可以对消息对进行编码,其中第一个消息告诉应用程序第二个消息中期望的类型。

您也可以按照您的描述创建 "master" 类型。您看到的开销是每个流产生一次,而不是每个值一次。