Klassen mit generischen Attributen mit Jackson lesen

bene2808

Aktives Mitglied
Hi Forum,

ich habe einen Datentyp ConstantSet mit Typparameter, der konstante Sets mit Elementen generischen Typs darstellt. Ich habe mehrere Klassen, die Attribute vom Typ ConstantSet haben und den generischen Typparameter mit verschiedenen Werten belegen.
Ich würde jetzt gerne an zentraler Stelle definieren, wie die ConstantSets zu lesen sind (z.B. mit einem Custom Deserializer), sodass es überall funktioniert. Ich möchte nicht Custom Deserializer für jede Klasse, die ConstantSet verwendet, erzeugen.🧐
Weiß jemand hier, wie das geht? Any help appreciated! :)
 

KonradN

Super-Moderator
Mitarbeiter
Ich denke, Du hast hier ein kleines Problem, denn der Typparameter existiert in erster Linie nur zur Compile Zeit. Das Stichwort ist dafür Type Erasure, das Du im Detail nachlesen müsstest.

Damit hast Du zur Laufzeit nur ein ConstantSet<Object>.

Du kannst für das ConstantSet einen Serializer und DeSerializer bauen, der die Elemente z.B. nicht direkt serialisiert sondern auch den Namen der Klasse serialisiert. Beim deserialisieren wird dann zuerst der Klassenname gelesen um dann gezielt diese Klasse zu deserialisieren.

Ich habe etwas in der Art bei meinem Projekt JAdventure mal mit Gson gebaut. Da ging es aber um eine Vererbungshierarchie. Aber da gab es dann auch eine List von solchen Objekten, die serialisiert / deserialisiert werden.

Ich selbst habe mit Jackson nicht viel gemacht bisher, daher kann ich Dir nicht sagen, wie es da laufen würde, aber ich vermute, dass es ebenso funktionieren kann mit Jackson. Was ich da mit Gson gemacht habe, findet sich z.B. unter 1.4.3 Serialisierung | JAdventure - Kurs zur Softwareentwicklung
 

bene2808

Aktives Mitglied
Hi @KonradN danke für die Antwort! :)
Hm ja, wenn ich den Klassennamen mitserialisieren würde, ginge es auf jeden Fall. Wobei ich das natürlich gerne vermeiden würde, solange ich keine Vererbung verwende.
Type Erasure ist mir ein Begriff. Ich frage mich allerdings, wie Jackson z.B. java.util.List<Typ> deserialisieren kann. Es muss ja hier auf das gleiche Problem stoßen. Also irgendwie muss es ja dann doch gehen. Ich habe einige Beispiele im Internet gefunden, wo mit generischen Typen gearbeitet wird, z.B. https://www.baeldung.com/java-deserialize-generic-type-with-jackson. Allerdings wird hier immer nur explizit direkt eine Instanz eines generischen Typs gelesen und nicht eine Klasse, die ein Attribut eines solchen Typs enthält. Ich bin mir nicht sicher, ob und wie ich das übertragen könnte. Hast du vielleicht noch eine Idee dazu? Danke! :)
 

KonradN

Super-Moderator
Mitarbeiter
Ich frage mich allerdings, wie Jackson z.B. java.util.List<Typ> deserialisieren kann.
Da dürftest Du genau sagen, dass Du eben eine List<Whetever> deserialisierst. Wenn Du genau weisst, was Du für eine Liste deserialisieren willst, dann kannst Du das vorgeben. Das siehst Du z.B. in dieser SO Antwort:

Ich bin (evtl. fälschlich) davon ausgegangen, dass Du da genau dieses Wissen nicht hast. Aber wenn Du den genauen Typ, der da deserialisiert wird, kennst, dann gibst Du dieses Wissen an Jackson oder Gson oder was auch immer Du nutzt und dann klappt das. Die Problematik, die ich gelöst hatte, kommt nur auf, wenn Du die konkrete Klasse nicht direkt vorgeben kannst.
 

bene2808

Aktives Mitglied
Genau, das in dem SO Thread ist relativ straightfoward. Nur so weit ich weiß, kann Jackson auch Klassen deserialisieren, die ein Attribut enthalten vom Typ List<Whatever>. Das heißt, hier dürfte die einzige Information darüber, in was die Elemente der Liste geparst werden sollen, in den Typklammern stehen. Und mir ist nicht ganz klar, wie das funktioniert...🧐
Anways, ich konnte das Problem jetzt lösen und es war ziemlich trivial. Mein ConstantSet hatte sowieso schon einen Konstruktor mit varargs Parameter, wo man ihm ein Array der Elemente mitgeben konnte. Den habe ich einfach noch mit JsonCreator annotiert und jetzt geht es. Wobei sich mir hier natürlich immer noch die Frage stellt, wo Jackson den Typ der Elemente herkriegt, wenn es den nicht aus den spitzen Klammern extrahieren kann.🤔
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W jaxws jaxb wsdl Java-Klassen generieren und binding.xml verwenden XML & JSON 1
S Jackson: Erstellen Sie Klassen für Jackson aus XSD XML & JSON 2
B Xml speichern - müssen alle Klassen deklariert werden? XML & JSON 12
S XML auf Java Klassen Mappen XML & JSON 10
B JAXB - manuell Klassen aus xsd XML & JSON 3
B aus xsd Java Klassen generieren XML & JSON 3
G jdom-Klassen in Eclipse importieren XML & JSON 2
R XSD aus Java Klassen erzeugen?? XML & JSON 2
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
O JAXB generierte Klassen sollen Serializable implementieren XML & JSON 1
S Java - Klassen erzeugen aus xsd bzw. wsdl XML & JSON 3
G Welche Klassen zum erzeugen/auslesen eines XML Files verwend XML & JSON 9
T Klassen aus XML-Schema generieren und füllen XML & JSON 10
Y Welchen XML Parser / Klassen aus XSD generieren lassen XML & JSON 4
H Klassen als XML rausschreiben - Jox XML & JSON 3
K Apache Digester - Vererbung, Abstrakte Klassen ? XML & JSON 4
M Aus DTD's Klassen auslesen XML & JSON 2
L JAXB - Generischen Wert mit Liste belegen XML & JSON 1
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
B ATTLIST: eigene Attributen XML & JSON 8
H xml-Datei mit Attributen einlesen XML & JSON 3
S JTree - Nur Elemente mit Attributen einfügen XML & JSON 2
R Problem beim Auslesen von Attributen XML & JSON 4
A JTree Struktur aus XML (mit Attributen) XML & JSON 12

Ähnliche Java Themen

Neue Themen


Oben