2015-03-12 19 views
17

Sto lavorando con google protobuf in Java. vedo che è possibile serializzare un messaggio protobuf a String, byte [], ByteString, ecc: (Fonte: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/MessageLite)Google Protobuf ByteString vs. Byte []

Non so quello che un ByteString è. Ho ottenuto la seguente definizione dalla documentazione dell'API protobuf (fonte: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/ByteString): "Sequenza immutabile di byte La sottostringa è supportata dalla condivisione del riferimento ai byte sottostanti immutabili, come con String."

Non mi è chiaro come ByteString sia diverso da una stringa o da un byte []. Qualcuno può spiegare per favore? Grazie.

risposta

23

Si può pensare a ByteString come un array di byte immutabile. Questo è praticamente tutto. È un byte[] che puoi usare in un protobuf. Protobuf non ti consente di utilizzare gli array Java perché sono mutabili.

ByteString esiste perché String non è adatto per rappresentare sequenze arbitrarie di byte. String è specifico per i dati dei caratteri.

L'interfaccia protobuf MessageLite fornisce i metodi toByteArray() e toByteString(). Se ByteString è un byte immutabile [], la rappresentazione in byte di un messaggio rappresentato da ByteString e da byte [] è la stessa?

Sort of. Se chiami toByteArray() otterrai lo stesso valore di se dovessi chiamare toByteString().toByteArray(). Confrontare l'attuazione dei due metodi, in 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); 
    } 
} 
+0

L'interfaccia protobuf MessageLite fornisce i metodi toByteArray() e toByteString(). Se ByteString è un byte immutabile [], la rappresentazione in byte di un messaggio rappresentato da ByteString e da byte [] è la stessa? –

+0

@RahimPirbhai vedi la mia modifica. –

2

Un ByteString ti dà la possibilità di eseguire più operazioni sui dati sottostanti senza dover copiare i dati in una nuova struttura. Ad esempio, se si desidera fornire un sottoinsieme di bytes in un byte[] a un altro metodo, sarà necessario fornirgli un indice iniziale e un indice finale. È anche possibile concatenare ByteStrings senza dover creare una nuova struttura dati e copiare manualmente i dati.

Tuttavia, con un ByteString è possibile fornire al metodo un sottoinsieme di tali dati senza che il metodo sappia nulla sullo storage sottostante. Proprio come una sottostringa di una stringa normale.

una stringa è per rappresentare il testo ed è non un buon modo per memorizzare i dati binari (come non tutti i dati binari ha una testuale equivalente a meno che non si codifica in un modo che fa: per esempio esadecimale o Base64).

Problemi correlati