Google Protobuf ByteString vs. Byte[]

2022-09-01 03:50:28

我正在使用Java中的google protobuf。我看到可以将protobuf消息序列化为String,byte[],ByteString等:(来源:https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/MessageLite)

我不知道什么是字节串。我从protobuf API文档(来源:https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/ByteString)中得到了以下定义:“不可变的字节序列。通过共享对不可变基础字节的引用来支持子字符串,就像String一样。

我不清楚ByteString与String或byte[]有何不同。有人可以解释一下吗?谢谢。


答案 1

您可以将其视为不可变的字节数组。差不多就是这样。这是一个你可以在原型中使用的。Protobuf不允许您使用Java数组,因为它们是可变的。ByteStringbyte[]

ByteString存在,因为 不适合表示任意字节序列。 专门用于字符数据。StringString

protobuf MessageLite Interface 提供了 toByteArray() 和 toByteString() 方法。如果 ByteString 是不可变的 byte[],那么由 ByteString 和 byte[] 表示的消息的字节表示形式是否相同?

差不多吧。如果调用,您将获得与调用 相同的值。比较这两种方法的实现,在:toByteArray()toByteString().toByteArray()AbstractMessageLite

public ByteString toByteString() {
  try {
    final ByteString.CodedBuilder out =
      ByteString.newCodedBuilder(getSerializedSize());
    writeTo(out.getCodedOutput());
    return out.build();
  } catch (IOException e) {
    throw new RuntimeException(
      "Serializing to a ByteString threw an IOException (should " +
      "never happen).", e);
  }
}

public byte[] toByteArray() {
  try {
    final byte[] result = new byte[getSerializedSize()];
    final CodedOutputStream output = CodedOutputStream.newInstance(result);
    writeTo(output);
    output.checkNoSpaceLeft();
    return result;
  } catch (IOException e) {
    throw new RuntimeException(
      "Serializing to a byte array threw an IOException " +
      "(should never happen).", e);
  }
}

答案 2

A 使您能够对基础数据执行更多操作,而无需将数据复制到新结构中。例如,如果要将 中的 子集提供给另一种方法,则需要为其提供起始索引和结束索引。您还可以进行连接,而无需创建新的数据结构并手动复制数据。ByteStringbytesbyte[]ByteStrings

但是,使用 a,您可以为该方法提供该数据的子集,而无需该方法对基础存储一无所知。就像普通字符串的子字符串一样。ByteString

String 用于表示文本,不是存储二进制数据的好方法(因为并非所有二进制数据都具有文本等效项,除非您以一种可以编码的方式对其进行编码:例如十六进制或 Base64)。