假设我必须创建和编写大量的protobuf消息,其中包含字符串字段(每个消息都不同)。我创建一个protobuf.Builder并将其重用于创建所有消息,设置此字符串字段并调用方法build()。我有字节作为输入,例如,对于每条消息,我都有byte [],应将其设置为字符串字段。因此,问题是-如何在不分配新内存的情况下将byte []设置为生成器的字符串字段?
据我了解,当在Java中使用protobuf构建器时,有两种设置字符串字段的方法:
第一个要求从byte []创建一个新的对象String,这就是为什么要分配新的内存。第二个方法需要使用ByteString的某些方法,例如ByteString.copyFrom(byte []),但是此方法(与ByteString的所有其他类似方法一样)不使用存在的字节数组,而是创建一个新的字节数组。那么,有什么解决方法吗?
如果您只想写出消息,则可以使用,然后再使用CodedOutputStream.writeBytes
。我通常不喜欢使用协议缓冲区,但这是另一回事。
从根本上讲,问题是byte[]
可变的,而Java中的protobuf消息是不可变的……这意味着您基本上必须复制一个副本。即使构建器本身是可变的,bytes
并且string
字段也被有效地视为原子的。(因此,您可以将构建器更改为字段具有不同的字节字符串或字符串值,但不更改字节字符串或字符串本身。)
您绝对不应该将string
字段用于非文本数据。您应该将bytes
字段用于任意二进制数据。一个string
字段应包含UTF-8编码的文本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句