2 Stimmen

Thrifth Deserialisierung von Listen

Bei Thrift können Listen direkt als Argumente oder Rückgabetypen verwendet werden, wenn es um einen Methodenaufruf bei einem Service geht. Wenn Sie eine explizite Objekt (de)Serialisierung benötigen, gibt es einen bequemen Weg (in Java), um Thrift für die (De)Serialisierung einer List< TBase > ohne separate Struktur in der Thrift IDL zu verwenden?

Konkret gesagt, nehmen wir an, ich habe in Thrift Folgendes definiert

struct A {
    1: required long x;
    2: required long y;
}

Ich kann eine Liste davon (de)serialisieren, indem ich Folgendes definiere

struct ListOfA {
    1: required list theList;
}

und dann

ListOfA myList = ...
TSerializer serializer = new TSerializer();
byte[] mySerializedList = serializer.serialize(myList);

Meine Frage ist, ob es möglich ist, diese (leicht unelegante) Definition einer zusätzlichen Struktur nur zur Aufnahme der List zu vermeiden.

Das Folgende funktioniert nicht, da TSerializer.serialize einen TBase erwartet

List myList = ... // List anstelle von ListOfA TSerializer serializer = new TSerializer(); byte[] mySerializedList = serializer.serialize(myList); //kompiliert nicht

Die Verwendung eines typedef in der IDL würde bereits helfen, aber diese werden anscheinend nicht in eine Java-Klasse übersetzt

typedef list ListOfA

\=> ListOfA ist nicht in dem generierten Java-Code definiert.

1voto

JensG Punkte 12601

Meine Frage ist, ob es möglich ist, diese (etwas unelegante) Definition einer zusätzlichen Struktur nur zu umgehen, um die Liste zu enthalten

Ich würde das Gegenteil empfehlen: Machen Sie den "ineffizienten" Schritt, eine Wrapper-Struktur zu verwenden.

Thrift erlaubt eine beliebige Anzahl von Eingabeargumenten. Es kann jedoch nur einen Rückgabewert geben. Es gibt keine solchen Dinge wie var oder out Parameter oder mehrere Rückgabewerte, daher sind Sie wirklich auf maximal einen Rückgabewert beschränkt, um die benötigten Daten zurückzugeben.

Der zweite Aspekt, der ins Spiel kommt, ist Sanfte Versionierung. Thrift ermöglicht es, die Schnittstellen und Datenstrukturen später zu erweitern, ohne ältere Dienste oder Clients zu unterbrechen. Wenn Sie sich entscheiden, dies zu tun

struct Bar { /*einige Daten*/ }

service Foo {
    list GibMirDieDaten()
}

schneiden Sie sich im Wesentlichen von diesem Mechanismus ab. Da die zurückgegebene list nicht um neue zusätzliche Elemente erweitert werden kann. In dem Fall müssen Sie einen weiteren Aufruf hinzufügen.

Im Gegensatz dazu ist es durch Verwendung einer umschließenden struct leicht möglich, die Rückgabedaten zu erweitern, und der Preis dafür ist nicht so hoch:

struct Bar { /*einige Daten*/ }

struct FooResult { 
  1: list   list
  // neue Elemente hier
}

service Foo {
    FooResult GibMirDieDaten()
}

Zudem ermöglicht das Letztere auch die Rückgabe einer NULL-Liste, was mit dem ersten Layout nicht möglich wäre.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X