2017-03-02 2 views
1

Ich versuche, die Google-Protobuf-Nachrichten, die von ZeroMQ empfangen wurden, zu deserialisieren und zu versuchen, mit dem folgenden Code in ein JSON-Format zu konvertieren. Aber in der endgültigen Ausgabe sind die Felder, die als Bytes definiert sind, nicht lesbar.Wie Deserialisierung Bytes, erhalten in Java von Google Protobuf?

(zum Beispiel "source_id": "\u0000PV\uff98t\uff9e").

Da es sich um eine maschinengenerierte Daten handelt, haben wir nicht den tatsächlichen Wert von der Quelle gesendet.

InputStream is = new ByteArrayInputStream(message.getBytes()); 
Schema.nb_event data = Schema.nb_event.parseFrom(is); 
String jsonFormat = JsonFormat.printToString(data); 

Ausgabe

{ "seq": 6479250, "timestamp": 1488461706,"op": "OP_UPDATE","topic_seq": 595736,"source_id": "\u0000PV\uff98t\uff9e","location": {"sta_eth_mac": {"addr": "xxxxxxx"},"sta_location_x": 879.11456,"sta_location_y": 945.0676,"error_level": 1220,"associated": true,"campus_id": "\uff9f\uff94\uffc7\uffa3\uffa2\b6\uffe3\uff92U\uff9f\uffdcN\'MT","building_id": "\uffee\u0016??X}5\u001a\uffaa\uffc4^\uffa0n\uffa4\ufffb\'","floor_id": "\uffd9/\"uF\uffdd3\uffdd\uff96\u0015\uff83~\u0005\uff8a(\uffd0","hashed_sta_eth_mac": "\u0013h\u0017\uffd0\uffef\uffc8\u001f\u0005V\u0010w?xxxxxx","loc_algorithm": "ALGORITHM_LOW_DENSITY","unit": "FEET"}} 

==

{ "seq":   6479250, 
    "timestamp": 1488461706, 
    "op":     "OP_UPDATE", 
    "topic_seq":  595736, 
    "source_id":   "\u0000PV\uff98t\uff9e", 
    "location":   { "sta_eth_mac":   { "addr": "\uffc0\uffcc\ufff8P\uffee." }, 
         "sta_location_x": 879.11456, 
         "sta_location_y": 945.0676, 
         "error_level":  1220, 
         "associated":   true, 
         "campus_id":   "\uff9f\uff94\uffc7\uffa3\uffa2\b6\uffe3\uff92U\uff9f\uffdcN\'MT", 
         "building_id":   "\uffee\u0016??X}5\u001a\uffaa\uffc4^\uffa0n\uffa4\ufffb\'", 
         "floor_id":    "\uffd9/\"uF\uffdd3\uffdd\uff96\u0015\uff83~\u0005\uff8a(\uffd0", 
         "hashed_sta_eth_mac": "\u0013h\u0017\uffd0\uffef\uffc8\u001f\u0005V\u0010w?\uff88\uffa8\uffee\u000fm.\u0015\uffe9", 
         "loc_algorithm":  "ALGORITHM_LOW_DENSITY", 
         "unit":     "FEET" 
         } 
    } 

Alle unleserlich Felder werden als Bytes in der Datei .proto definiert.
Ist ein zusätzlicher Schritt erforderlich, um diese Werte zu erhalten?

optional bytes building_id  = 10; 
    optional bytes floor_id   = 11; 
    optional bytes hashed_sta_eth_mac = 12; 
+0

Nun ja, das ist undurchsichtig binäre Daten. Warum sollten Sie erwarten, dass Sie es als Text lesen können? Grundsätzlich wären sie in Java ein 'byte []'. Zugegebenermaßen würde ich erwarten, dass der JSON-Formatierer sie in base64 anstatt in das Format konvertiert, das Sie gezeigt haben, aber es wäre immer noch kein lesbarer Text. –

+0

Tatsächlich sollte das normale 'JsonFormat' die Bytes als Base64 serialisieren: https://github.com/google/protobuf/blob/34a1b6e6b8c0d477504d09df4df4b86770e47872/java/util/src/main/java/com/google/protobuf/util /JsonFormat.java#L992 Ist das die 'JsonFormat' Klasse, die du benutzt, oder ist das etwas anderes? (Nebenbei, ist 'message' ein' String' oder etwas anderes? Wenn es so ist, ist 'getBytes()' so zu nennen eine schlechte Idee.) Grundsätzlich würde ein [mcve] es einfacher machen, dir zu helfen. –

+0

Die Anforderung besteht darin, die Daten zu deserialisieren und als reinen Text im JSON-Format in unseren Datensee zu schreiben. Gibt es eine Arbeit, um den tatsächlichen Wert zu erhalten? –

Antwort

0

Der JSON Formatierer com.googlecode.protobuf.format.JsonFormat wurde als Bytes Rückkehr, aber ich war in der Lage in das gewünschte Format Base64 Zeichenfolge zu erhalten, nachdem die JSON Formatierer com.google.protobuf.util.JsonFormat ändern.

Verwandte Themen