2017-01-19 1 views
1

Ich habe eine Reihe von Strukturen in Thrift definiert. Konzeptionell sind einige dieser Strukturen Unterklassen einer gemeinsamen Elternklasse. Da Thrift nicht struct Vererbung nicht unterstützt, habe ich die folgende Strategie, um die Strukturen zu definieren:Abgleich der fehlenden Vererbung in der Sparsamkeit mit Methodendefinitionen in Java/Scala

Beispiel

Say A und B sind Subtypen von Eltern type P. Hier sind meine thrift Definitionen zu vertreten, dass:

struct P { 
    1: i32 childType, 
    2: list<byte> payload 
} 

struct A { 
    1: i32 x 
} 

struct B { 
    1: i32 y 
} 

Objekte type A and B serialisiert werden als Datensätze von type P (das payload Feld würde speichern die serialisierte Version des Objekts und dem Wert von childType zeigt an, ob die serialisierten Nutzlast von type A or B). Während der Deserialisierung zeigt der Wert des Felds childType an, wie payload deserialisiert werden muss.

Dieser Ansatz bereitet jedoch Schwierigkeiten beim Schreiben von Code in einer objektorientierten Sprache wie Java oder Scala. Zum Beispiel kann ich in einer Funktion, die ein Objekt type P zurückgibt, kein Ergebnis type A oder type B zurückgeben.

Frage

(i) Gibt es eine empfohlene Vorgehensweise, mit diesem Problem umgehen? dh, wie gleicht man die fehlende Vererbung in Thrift mit Java/Scala Code, der die Vererbung nutzt?

Vielen Dank im Voraus.

Antwort

0

Ich kann nicht sagen, ob es einen besseren Ansatz mit Java/Scala gibt, aber in unseren Fällen fügt das Hinzufügen eines zusätzlichen Thrift-Strukturelements, das auf seine "Super" verweist, Thrift-Struktur was wir wollen.

struct Foo { 
    1: i32 wtf 
} 

struct Bar { 
    1 : Foo super_ 
    2 : double moredata 
} 

Natürlich ist das nur eine Art Workaround, aber wir können damit leben.

0

Eine andere Problemumgehung besteht darin, Sparset Unions zu verwenden, obwohl die Unterstützung der Gewerkschaften für Sparsamkeit (zumindest in einigen Sprachen) nicht groß ist. Siehe docs.

Ich ändere Ihre Probe ein wenig (B.y ist jetzt Zeichenfolge), um ein besseres Beispiel zu geben. Betrachten Sie diese thrift-Datei:

struct A { 
    1: i32 x 
} 

struct B { 
    1: string y 
} 

union P { 
    1: A a, 
    2: B b 
} 

In Java-Code generiert durch thrift Compiler 0.9.0, hat P Klasse mehrere Methoden, die Sie verwenden können, um festzustellen, ob P A oder B enthält: isSetA/isSetB, getA/getB und getSetField Das gibt eine Enumeration zurück, die den Typ angibt.

Die generierten Codes: A.java, B.java und P.java