Für Kontext speichern wir die meisten unserer Daten als JSON-Zeichenfolgen. Dies funktioniert sehr gut mit Hadoop im Backend und ist in Ruby am Frontend einfach zu handhaben. Meine Datentypen entsprechen dem natürlichen Muster für die Vererbung.Polymorphismus oder Vererbung in JSON mit Java und Ruby
Der Einfachheit halber sagen wir, ich habe eine Klasse Pet und ein Prozess FeedPet, die ein Haustier füttert. Ich habe auch einen Prozess WalkDog, der nur für Hund gilt, der eine Art Haustier ist. Meine Daten sind so organisiert, dass ich mir keine Sorgen machen muss, dass ich versuchen muss, ein Haustier zu gehen, das kein Hund ist.
Was ich tun möchte ist Pet und Hund erweitert Pet, mit Hund eine zusätzliche Methode "getLeash()", aber ich kann nicht herausfinden, wie dies zu JSON zuordnen.
Stattdessen habe ich eine Klasse Pet mit einem Dataset hashmap, also würde der WalkDog-Prozess pet.getSpeciesData ("Leine") anstelle von dog.getLeash() aufrufen.
Ich kann einen Hund erstellen erweitert Pet, und ich kann das zu JSON mit der Jackson-Bibliothek serialisieren. Das JSON-Objekt wird ein Leine-Feld haben. Aber gehe davon aus, dass ich alle Haustiere füttern möchte. Alle Haustiere haben eine getFood() Methode. Der FeedPet-Prozess deserialisiert also die Objekte an Pet. Aber das verliert das Leine-Feld.
Der WalkDog-Prozess kann dies tun, weil er weiß, dass alle seine Eingaben Hunde sein werden, so dass er es als Hund lesen und als Hund zurückschreiben kann.
Gibt es eine Möglichkeit, Java-Objekte zu JSON serialisieren, so dass ich ihren Typ beibehalten kann? Ich denke etwas wie Rails Single Table Vererbung, aber es müsste etwas sein, dass die JSON-Bibliotheken verstehen.
Ich denke, Sie haben den Kern davon beantwortet, es gibt keine Standardmethode, dies in JSON darzustellen. JACKSON-91 würde mir genau das geben, was ich will, denn in meinem Fall lese ich nur die Daten in Ruby. –
Ah ok. Eigentlich würde 91 nur benötigt, wenn Sie es in Java lesen müssten. Um Klasseninformationen zu schreiben, könnte es leichtere Wege geben (91 würde das natürlich auch abdecken). Eine Möglichkeit wäre, Object.getClass() serialisierbar zu machen (SerializationConfig.Feature.OUTPUT_CLASS_NAME?). – StaxMan