2015-03-12 19 views
17

Pracuję z google protobuf w Javie. widzę, że jest to możliwe do serializacji wiadomość Protobuf do string, byte [], ByteString itp: (Źródło: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/MessageLite)Google Protobuf ByteString vs. Byte []

nie wiem co ByteString jest. Mam następującą definicję z dokumentacji API protobuf (źródło: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/ByteString): "Niezmienna sekwencja bajtów. Substring jest obsługiwany przez dzielenie odniesienia do niezmiennych bazowych bajtów, tak jak w przypadku String."

Nie jest dla mnie jasne, w jaki sposób ByteString różni się od ciągu lub bajtu []. Czy ktoś może wyjaśnić? Dzięki.

Odpowiedz

23

Można myśleć o ByteString jako niezmiennej tablicy bajtów. To prawie wszystko. Jest to byte[], którego można używać w protobuf. Protobuf nie pozwala używać tablic Java, ponieważ są one zmienne.

ByteString istnieje ponieważ String nie nadaje się do reprezentowania dowolnych sekwencji bajtów. String dotyczy danych postaci.

Protobuf MessageLite Interface udostępnia metodyByteArray() i toByteString(). Jeśli ByteString jest niezmiennym bajtem [], czy bajtowa reprezentacja wiadomości reprezentowanej przez ByteString i bajt [] będzie taka sama?

Sortuj. Jeśli zadzwonisz pod numer toByteArray(), uzyskasz taką samą wartość, jak gdybyś zadzwonił pod numer toByteString().toByteArray(). Porównaj realizację dwóch metod, w 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

Protobuf MessageLite Interface udostępnia metodyByteArray() i toByteString(). Jeśli ByteString jest niezmiennym bajtem [], czy bajtowa reprezentacja wiadomości reprezentowanej przez ByteString i bajt [] będzie taka sama? –

+0

@RahimPirbhai zobacz moją edycję. –

2

ByteString daje możliwość wykonywania wielu operacji na danych źródłowych, bez konieczności kopiowania danych do nowej struktury. Na przykład, jeśli chcesz dostarczyć podzbiór bytes w byte[] do innej metody, musisz podać mu indeks początkowy i indeks końcowy. Można również połączyć ByteStrings bez konieczności tworzenia nowej struktury danych i ręcznego kopiowania danych.

Jednak z wartością ByteString można podać metodę podzbioru tych danych bez konieczności posiadania przez system żadnej informacji o podstawowej pamięci masowej. Podobnie jak podciąg normalnego łańcucha.

Ciąg służy do reprezentowania tekstu i jest , a nie dobrym sposobem przechowywania danych binarnych (ponieważ nie wszystkie dane binarne mają tekstowy ekwiwalent, chyba że zostanie zakodowany w sposób, który powoduje: np. Hex lub Base64).

Powiązane problemy