java - protobuffers - ByteString de Google Protobuf vs. Byte
protocol buffer list (2)
Un ByteString
le permite realizar más operaciones en los datos subyacentes sin tener que copiar los datos en una nueva estructura. Por ejemplo, si desea proporcionar un subconjunto de bytes
en un byte[]
a otro método, deberá proporcionarle un índice de inicio y un índice final. También puede concatenar ByteStrings
sin tener que crear una nueva estructura de datos y copiar manualmente los datos.
Sin embargo, con un ByteString
puede darle al método un subconjunto de esos datos sin que el método sepa nada sobre el almacenamiento subyacente. Al igual que una subcadena de una cadena normal.
Una cadena es para representar texto y no es una buena manera de almacenar datos binarios (ya que no todos los datos binarios tienen un equivalente textual a menos que lo codifique de una manera que lo haga: por ejemplo, hex o Base64).
Estoy trabajando con google protobuf en Java. Veo que es posible serializar un mensaje protobuf a String, byte [], ByteString, etc.: (Fuente: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/MessageLite )
No sé qué es un ByteString. Obtuve la siguiente definición de la documentación de la API de protobuf (fuente: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/ByteString ): "Secuencia inmutable de bytes. Substring es compatible compartiendo la referencia a los bytes subyacentes inmutables, como con String ".
No me queda claro cómo un ByteString es diferente de un String o byte []. ¿Alguien por favor puede explicar? Gracias.
Puede pensar en ByteString
como una matriz de bytes inmutable. Eso es practicamente todo. Es un byte[]
que puedes usar en un protobuf. Protobuf no te permite usar arreglos Java porque son mutables.
ByteString
existe porque String
no es adecuado para representar secuencias arbitrarias de bytes. String
es específicamente para datos de caracteres.
La interfaz protobuf MessageLite proporciona los métodos toByteArray () y toByteString (). Si ByteString es un byte inmutable [], ¿la representación en bytes de un mensaje representado por ByteString y byte [] sería la misma?
Una especie de Si llama a toByteArray()
obtendrá el mismo valor que si fuera a llamar a toByteString().toByteArray()
. Compare la implementación de los dos métodos, en 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);
}
}