Wie kann ich unter Verwendung von GPB meine Wrapper -Klassen aufhören, binäre Nachrichten zu akzeptieren, die nicht für sie bestimmt sind?

StackOverflow https://stackoverflow.com/questions/1681263

  •  16-09-2019
  •  | 
  •  

Frage

Ich benutze Google Protocol Puffer einige meiner Geschäftsobjekte (in einer Java -App) zu serialisieren. Wie in den Tutorials empfohlen, wickle ich den Message Builder in eine eigene Klasse ein, die Getter- und Setter -Methoden implementiert, um auf die Eigenschaften der Nachricht zuzugreifen. Außerdem habe ich alle Nachrichtenfelder deklariert optional, erneut nach ihren Empfehlungen.

Jetzt kann ich einem der codierten Nachrichten einen der Wrapper -Klassen geben, und sie werden sie immer analysieren und akzeptieren. Dies führt zu Wrapper -Objekten, die einen Nachrichtentyp darstellen, den sie nicht tatsächlich enthalten, und es kommt zu viel Schein.

Wie kann ich beim Laden des binären Inhalts einer Nachricht in eine Wrapper -Klasse einen Fehler machen, wenn sie den falschen Typ übergeben wurde?

Die Lösung, an die ich derzeit denke, würde alle Nachrichten eine Basisnachricht mit einem erforderlichen Feldtyp (und möglicherweise einem Versionsfeld) erweitern. Dies hätte die generierte Builder -Klasse eine Ausnahme, wenn diese Felder fehlen, und wenn sie dort sind, kann ich meinen eigenen Code einchecken. Ich habe jedoch noch nicht bewertet, welche Auswirkungen dies für meinen Code hat, und ich bin mir nicht sicher, ob dies einfach sein wird.

War es hilfreich?

Lösung 2

Dies scheint auch das zu sein, was andere Menschen tun, und es funktioniert gut für mich:

message TypedMessage {
    required string type = 1;
    required bytes payload = 2;
}

Die tatsächliche Nachricht wird in serialisiertem Formular in das Nutzlastfeld eingeleitet und der Typ wird verwendet, um den richtigen Bauunternehmer und die Wrapper -Klasse zu erhalten. Das Feld könnte auch eine Aufzählung sein, ich verwende derzeit Java -Klassennamen, die ich wahrscheinlich später durch ein anderes System ersetzen werde, da dies bedeutet, dass die Kompatibilität des Parsers nach hinten die Rückwärtsbrüche refactoring.

Andere Tipps

Wenn die von Ihnen übergebenen Daten an myMessage.parsefrom () keine Nachricht dieses Typs darstellen, erhalten Sie eine InvalidProtocolBufFexception. Ist das nicht genug für dich?

PB-Nachrichten sind nicht selbst beschrieben. Sie müssen daher (auf irgendeine Weise) wissen, welche Nachricht Sie analysieren möchten. Natürlich können Sie versuchen, sie zu analysieren und InvalyProtocolBufferexception zu fangen, aber das ist nicht sehr schön. Stattdessen denke ich, dass die meisten Menschen den Ansatz verwenden, den Sie beschreiben: Verwenden Sie eine Basismeldungsklasse mit einem Typentyp (normalerweise einer Aufzählung) und einer Reihe optionaler Felder, die für jeden möglichen Untertyp. Auf diese Weise können Sie die Nachricht analysieren und dann den Nachrichtentyp einschalten, um die tatsächliche "Nutzlast" der Nachricht zu extrahieren.

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