Mit Gson und Abstrakte Klassen
Ich versuche zum Austausch von Nachrichten zwischen einem client und einem server mittels GSON.
Das problem ist Folgendes:
Habe ich diese Struktur:
public class Message
{
private TypeOfContent type; // It's a enum
private Content content;
....
}
Dann das Objekt content können einen unterschiedlichen Satz von Klassen.
Fand ich 2 tutorials hier und hier, aber keiner von Ihnen das problem löst.
Edit1:
Die Klasse Message ist:
public class Mensagem
{
private TipoMensagem type;
private Conteudo conteudo;
private Cliente autor;
private Cliente destino; //null -> to all(broadcast)
}
Und Inhalt ist dieser:
public class Conteudo
{
protected TipoConteudo typeConteudo;
protected String texto;
protected Posicao posicao;
public Conteudo(TipoConteudo typeConteudo, String texto, Posicao posicao)
{
this.texto = texto;
this.posicao = posicao;
this.typeConteudo = typeConteudo;
}
}
Und ein Beispiel für eine extend-Klasse von contedo ist:
public class ConteudoTweet extends Conteudo
{
protected String pathImagem;
public ConteudoTweet(TipoConteudo typeConteudo, String tweet, Posicao location, String picturePath)
{
super(typeConteudo,tweet, location);
this.pathImagem = picturePath;
}
}
Endlich das, was ich mache, ist wie : "String strObject = new Gson().toJson(mensage);" funktioniert aber auf der Deserialisierung es nicht, weil es meint immer, dass es von der Content-Klasse
- Haben Sie ein problem mit der Serialisierung, Deserialisierung, beide?
- beide. Wenn ich versuche, es zu serialisieren zu bekommen ist, in einer Schleife und ich bekomme ein "stack over flow" - Fehler. Die Sache ist die abstrakte Klasse zufrieden ist und keine Botschaft
- Gson ist nicht in der Lage zu magisch-Abbildung aus einem unbekannten Kind-Klasse Typ basiert auf einem JSON-string. Sie gehen zu müssen, schreiben Sie eine benutzerdefinierte serializer, der schaut auf Ihre
TypeOfContent
enum und entsprechend agiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich endlich gelöst!
Beachten Sie, dass: "registerTypeAdapter(AbstractClass.class, neue InterfaceAdapter());"
durch AbstractClass.class ich meine die Klasse, die Sie implementieren, in meinem Fall war es Conteúdo werden könnte ConteudoTweet oder ConteudoUserSystem und so weiter...
Die Umsetzung der InterfaceAdapter ist :
Und dieser InterfaceAdapter ist generisch, so sollte es funktionieren im Allgemeinen...
Das ist es!
Sollten Sie einen Blick auf eine ähnliche Frage habe ich hier beantwortet :
https://stackoverflow.com/a/22081826/3315914
Müssen Sie Gson ist RuntimeTypeAdapterFactory
Und registrieren Sie die Basisklasse und alle Kind-Klassen zu machen, damit es funktioniert.