在流中表示重复数据的正确方法

时间:2014-05-16 19:16:44

标签: java protocol-buffers

有关如何支持repeated消息的任何建议?具体来说,如果这些消息都是一种类型。在JSON中,这些本质上是一个数组。在我的情况下,我不关心索引,但这并不是说数组类型对protobuf没用。我考虑过以下方法,但我没有'像权衡一样。通过阅读Google文档,我们无法明确哪种方法可用于收藏。

  1. 使用任何现有消息,只有一堆空字段

    您可以使用现有类型,只包含所需的重复邮件集合。因此,如果用户消息类型具有重复的照片消息类型,则发送一个只有照片集合字段的空用户。

  2. 创建包装类型

    这就是#1的作用,但不是使用现有类型,而是创建一个新类型。这是一个更清洁,因为它是明确的,并没有使用空字段。还有消息输入。在照片的情况下,这将是一个只有重复照片消息字段的ArrayOfPhotos消息。

  3. 使用分隔流

    对于这种方法不太确定,因为我还没有尝试过,但是protobuf支持分隔流。这看起来很酷,但我认为它有不太强的打字的缺点。 Streams可以包含不同消息类型的抓包。

    虽然此选项不需要额外的消息类型,但看起来很有用。

    在照片的情况下,这将是分隔的照片消息,但同样,您似乎也可以抛出用户消息。

1 个答案:

答案 0 :(得分:0)

听起来,当您的顶级数据是数组而不是记录时,您正在尝试询问该怎么做。 (你的问题并不完全清楚你是否在询问顶层,但我不明白这个问题。)

要问自己的问题是:

  1. 有没有可能有一天你会想要在这条消息中添加一些辅助数据,这些辅助数据没有附加到任何一个对象上?例如,也许您的照片列表有一天会附上相册名称。在这种情况下,您当然希望使用您的解决方案#2,因为它可以让您灵活地在以后添加其他字段而不会弄乱现有的某些消息类型。
  2. 客户端或服务器是否必须将整个数据集保存在内存中并一次解析/序列化它?这是单个消息的要求。例如,如果您要发送1GB的照片,您可能希望每个端口一次只能处理一张或几张照片。在这种情况下,您当然需要解决方案#3。
  3. 在任何情况下,我都不建议使用解决方案#1。