web-dev-qa-db-ja.com

Google Protobuf ByteStringとByte []

私は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 []とどのように異なるかは私には明らかではありません。誰か説明してもらえますか?ありがとう。

26
Rahim Pirbhai

ByteStringは不変のバイト配列と考えることができます。それはほとんどそれです。これは_byte[]_であり、protobufで使用できます。 Protobufでは、可変配列なのでJava配列を使用できません。

ByteStringは、Stringが任意のバイトシーケンスを表すのに適していないために存在します。 Stringは、文字データ専用です。

Protobuf MessageLiteインターフェイスは、toByteArray()およびtoByteString()メソッドを提供します。 ByteStringが不変のbyte []である場合、ByteStringとbyte []の両方で表されるメッセージのバイト表現は同じでしょうか?

並べ替え。 toByteArray()を呼び出すと、toByteString().toByteArray()を呼び出す場合と同じ値が得られます。 AbstractMessageLiteの2つのメソッドの実装を比較します。

_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);
  }
}
_
32
Matt Ball

ByteStringを使用すると、データを新しい構造にコピーすることなく、基になるデータに対してより多くの操作を実行できます。たとえば、byte[]bytesのサブセットを別のメソッドに提供する場合、開始インデックスと終了インデックスを提供する必要があります。新しいデータ構造を作成して手動でデータをコピーすることなく、ByteStringsを連結することもできます。

ただし、ByteStringを使用すると、メソッドが基礎となるストレージについて何も知らなくても、メソッドにそのデータのサブセットを与えることができます。通常の文字列の部分文字列のように。

文字列はテキストを表すためのものであり、notバイナリデータを保存するのに適した方法です(すべてのバイナリデータは、行う方法:たとえば、hexまたはBase64)。

5
Chris Thompson