Frage

Mit Google Protocul Buffers , habe ich einen Dienst bereits in Java geschrieben, hat seine eigene Datenstrukturen bereits. Ich möchte pb verwenden, um Nachrichten zu liefern, und ich bin auf der Suche nach einer Möglichkeit, die vorhandenen Datenstrukturen zu serialisieren, die ich in Java zu pb haben. Ich kann durch die Definition alle Datenstrukturen in pb von Grund auf neu beginnen, das ist wahrscheinlich der richtige Weg zu gehen, aber ich bin zu faul. Also, ich habe eine Person-Klasse in Java (oder anderen unterstützten Sprachen) oder einer Ebene Klasse, die Zehn Attribute in sich hat, gibt es eine Möglichkeit, dass die Klasse zu serialisiert pb? Kann ich ein pb Attribut vom Typ Flugzeug habe? (Wenn Flugzeug ist kein pb, es ist eine Java-Klasse)

War es hilfreich?

Lösung

Nein, kann man nicht. Die Felder in protobuf Meldungen sind immer die Primitiven (Zahlen, Strings und Byte-Arrays, im Grunde), protobuf Aufzählungen (die als Java Aufzählungen erzeugt werden) oder protobuf Nachrichten -. Und wiederholten Versionen aller die, natürlich

Sie könnte möglicherweise ein Tool schreiben, die Reflexion verwendet, um eine .proto Datei aus einer Java-Klasse zu erstellen, aber ich vermute, dass Sie es einfach schneller finden würde es von Hand zu tun. Insbesondere, wenn Sie haben Reflektion verwenden Sie sicherstellen wollen würde, dass die Felder immer mit dem gleichen Namen erzeugt wurden, Kompatibilität zu erhalten. Eine Sache, die Sie könnte zu tun ist, um die Java-Klassen mit Anmerkungen versehen und Code schreiben, die Proto-Datei zu erzeugen, auf der Grundlage dieser Anmerkungen - oder sogar potenziell serialisiert werden direkt an Proto-Format der Anmerkungen verwenden. Persönlich würde ich empfehlen, in die .proto-Datei erstellen einig Art und Weise, anstatt effektiv das PB-Projekt Umschreiben -. Sonst gibt es ein erhebliches Risiko von Fehlern Einführung, wo es bereits gründlich getestet Code

Wenn Sie Sie eine Anmerkung System schaffen, ich bin sicher, dass Kenton Varda (und der Rest der PB-Gemeinschaft) in würde interessieren, es zu sehen.

Andere Tipps

Ein Weg, ich denken kann, ist ein String-Feld in einem protobuf zu haben und eine Java-Klasse auf dieses Gebiet mit Hilfe von Java primitiver Serialisierung serialisiert. Auf diese Weise weiß der Empfänger der Nachricht angenommen, wie es zu lesen / deserialisieren, kann ich leicht serialisieren Java Java-Nachrichten.

Es gibt Nachteile dieser Technik, though. Ein paar zu nennen:

  1. Es ist nur Java Java (ohne C ++, Python oder andere)
  2. Es ist nicht so effizient wie nativer protobufs sind (weder Parsing / serializatin weise noch Nachrichtengröße weise)
  3. Sie haben die Logik der Datenstrukturen, um an mehreren Stellen verstreut, sind einige in der protobufs Definitionsdatei, einige in anderen Java-Klassen und das macht die Sache schwieriger aufrecht zu erhalten.

Aber -. Es wird die Arbeit für die kurzfristigen getan

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top