私は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 []とどのように異なるかは私には明らかではありません。誰か説明してもらえますか?ありがとう。
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);
}
}
_
ByteString
を使用すると、データを新しい構造にコピーすることなく、基になるデータに対してより多くの操作を実行できます。たとえば、byte[]
のbytes
のサブセットを別のメソッドに提供する場合、開始インデックスと終了インデックスを提供する必要があります。新しいデータ構造を作成して手動でデータをコピーすることなく、ByteStrings
を連結することもできます。
ただし、ByteString
を使用すると、メソッドが基礎となるストレージについて何も知らなくても、メソッドにそのデータのサブセットを与えることができます。通常の文字列の部分文字列のように。
文字列はテキストを表すためのものであり、notバイナリデータを保存するのに適した方法です(すべてのバイナリデータは、行う方法:たとえば、hexまたはBase64)。