【问题标题】:Protobuf builder: set string field without memory allocationProtobuf builder:设置字符串字段而不分配内存
【发布时间】:2014-06-17 03:43:53
【问题描述】:

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

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

  1. 设置(字符串字段)
  2. 设置(字节字符串字段)

第一个需要从 byte[] 创建一个新的对象 String,这就是为什么要分配新的内存。 第二种需要使用 ByteString 的一些方法,例如 ByteString.copyFrom(byte[]),但是这种方法(与 ByteString 的所有其他类似方法一样)不使用现有的字节数组,而是创建一个新的。 那么,有什么解决方法吗?

【问题讨论】:

    标签: java string memory-management protocol-buffers


    【解决方案1】:

    如果您只对写出消息感兴趣,则可以使用非常低的级别并使用CodedOutputStream.writeBytes。这不是我通常喜欢使用协议缓冲区的方式,但那是另一回事。

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

    您绝对应该string 字段用于非文本数据。您应该将bytes 字段用于任意二进制数据。 string 字段应包含 UTF-8 编码的文本。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 2020-10-25
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      相关资源
      最近更新 更多