一尘不染

Google Protobuf ByteString与Byte []

java

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

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

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


阅读 335

收藏
2020-12-03

共1个答案

一尘不染

您可以将其ByteString视为不可变的字节数组。就是这样。byte[]您可以在protobuf中使用它。Protobuf不允许您使用Java数组,因为它们是可变的。

ByteString之所以存在,String是因为它不适合表示任意字节序列。String专用于字符数据。

protobuf MessageLite接口提供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);
  }
}
2020-12-03