我正在考虑使用gob(“encoding / gob”)来序列化网络协议中的数据,我一直在搜索,似乎无法找到解决这些问题的任何方法:
消息框架 - gob文档给人的印象是你可以简单地将你的TCP连接包装在一个gob解码器中并读出来。但是如果你只收到一半信息会怎么样? gob可以以某种方式解决这个问题,还是我被迫添加一个消息帧并将消息数据复制到缓冲区以供gob反序列化?
不同类型的消息 - 协议有不同类型的消息,如何最好地处理gob?通过在每个gob blob之前有一个标识符来指示数据的类型?通过将所有消息放入“主”消息中,该消息包含所有不同消息的字段(将其减少为仅一种类型的消息)? 我尝试了后者(更简单),它似乎有一个巨大的开销(> 650字节)。
答案 0 :(得分:3)
gob文档给人的印象是你可以简单地将你的TCP连接包装在一个gob解码器中并读出来。
正确。该包旨在在编码器和解码器之间流式传输多个值。
但是如果你只收到一半信息会怎么样?
解码器调用底层的io.Reader来获取数据。如果读者无法返回数据,则读者将返回错误。解码器将此错误返回给应用程序。
如果io.Reader返回错误,则无法恢复解码流。
不同类型的消息
您可以编码消息对,其中第一个告诉应用程序在第二个消息中期望的类型。
您还可以按照描述创建“主”类型。您看到的开销是每个流产生一次,而不是每个值产生一次。