Protobuf构建器:设置字符串字段而不分配内存

时间:2014-04-30 17:34:21

标签: java string memory-management protocol-buffers

假设我必须创建和编写大量的protobuf消息,其中包含字符串字段(每条消息都不同)。我创建了一个protobuf.Builder并重用它来创建所有消息,设置此字符串字段并调用方法build()。我有字节作为输入,例如对于每个消息,我有byte [],应该设置为string-field。所以问题是 - 如何在没有新内存分配的情况下将byte []设置为构建器的字符串字段?

据我了解,在java中使用protobuf构建器时,有两种方法可以设置字符串字段:

  1. set(字符串字段)
  2. set(ByteString field)
  3. 第一个需要从byte []创建一个新的对象String,这就是新内存分配的原因。 第二个需要使用ByteString的一些方法,例如ByteString.copyFrom(byte []),但是这个方法(与ByteString的所有其他类似方法一样)不使用存在的字节数组,而是创建新的字节数组。 那么,有没有解决方法呢?

1 个答案:

答案 0 :(得分:3)

如果您只对编写消息感兴趣,可以使用CodedOutputStream.writeBytes。我通常不喜欢使用协议缓冲区,但这是另一回事。

从根本上说,问题是byte[]是可变的,而Java中的protobuf消息应该是不可变的 ...这意味着你采取一份,基本上。尽管构建器本身是可变的,但bytesstring字段被视为原子的,有效的。 (因此,您可以更改构建器以使字段具有不同的字节字符串或字符串值,但不会改变字节字符串或字符串本身。)

你绝对不应该 使用string字段来查找不是文本的数据。您应该使用bytes字段来表示任意二进制数据。 string字段应包含UTF-8编码的文本。