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

迪玛

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

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

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

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

乔恩·斯基特

如果您只想写出消息,则可以使用,然后再使用CodedOutputStream.writeBytes我通常不喜欢使用协议缓冲区,但这是另一回事。

从根本上讲,问题是byte[]可变的,而Java中的protobuf消息是不可变的……这意味着您基本上必须复制一个副本。即使构建器本身是可变的,bytes并且string字段也被有效地视为原子的。(因此,您可以将构建器更改为字段具有不同的字节字符串或字符串值,但不更改字节字符串或字符串本身。)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

一个不分配任何char内存的const字符串构造函数?

来自分类Dev

awk不分配字符串或子字符串

来自分类Dev

awk不分配字符串或子字符串

来自分类Dev

不分割器分割字符串

来自分类Dev

通过字符串声明分配内存

来自分类Dev

临时字符串的内存分配

来自分类Dev

C / C ++字符串内存分配

来自分类Dev

分配给字符串的内存

来自分类Dev

C / C ++字符串内存分配

来自分类Dev

为字符串正确分配内存

来自分类Dev

改善字符串内存分配的方法

来自分类Dev

新不分配内存

来自分类Dev

新不分配内存

来自分类Dev

字符串内存分配中可能的内存泄漏

来自分类Dev

创建一个字符串数组而不分配每个字符串

来自分类Dev

AJAX不分隔JSON字符串

来自分类Dev

不分配内存分配的指针

来自分类Dev

堆栈上C ++字符和字符串的内存分配

来自分类Dev

C#从字符串设置字段

来自分类Dev

R:为字符串预分配内存

来自分类Dev

动态内存/重新分配字符串数组

来自分类Dev

为什么在声明字符串时无需分配内存

来自分类Dev

当结构包含字符串时为结构分配内存

来自分类Dev

将内存分配给字符串数组

来自分类Dev

带字符串结构的C ++内存分配

来自分类Dev

为结构数组元素(字符串)分配内存

来自分类Dev

为什么Java字符串在堆上分配了内存?

来自分类Dev

在c中为字符串分配内存?

来自分类Dev

将内存分配给特定的“字符串”