Ответ 1
Вы можете думать о ByteString
как неизменяемом массиве байтов. Это в значительной степени. Это a byte[]
, который вы можете использовать в protobuf. Protobuf не позволяет использовать Java-массивы, поскольку они изменяемы.
ByteString
существует, потому что String
не подходит для представления произвольных последовательностей байтов. String
предназначен специально для символьных данных.
Интерфейс MessageLite protobuf предоставляет методыByteArray() и toByteString(). Если ByteString является неизменным байтом [], будет ли байтовое представление сообщения, представленного как ByteString, так и байтом [], одинаковым?
Сорт. Если вы вызываете 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);
}
}