Ich stehe momentan vor einem seltsamen Problem auf das ich keine Lösung finden konnte:
Mittels gson serialisiere und deserialisiere ich eine Klasse (Java -> Java, die gleiche Binary und auch die gleiche Klasse). Nun habe ich in der Klasse einen
Java:
publicObject payload;
welches ich vor dem serialisieren setze:
Java:
payload ="Ich bin ein String";
nach dem deserialisieren versuche ich auf den String zuzugreifen:
Java:
String thePayload =(String)payload;
oder
Java:
String thePayload = payload.toString();
Beide Varianten funktionieren nicht. Bei der Ersten bekomme ich den Fehler, dass ein Object nicht zu einem String konvertiert werden kann. Bei der zweiten Variante bekomme ich einen String mit dem Inhalt "java.lang.Object@b9b618".
Was kann ich tun, damit ich den String wiederbekomme?
Mal doof gefragt: Hat es einen bestimmten Grund warum du payload nicht als String deklarierst in deiner java-Klasse? Dann sollte gson da auch etwas vernünftiges draus machen?!
Ja, einen Grund hat es. Ich kommuniziere mit der Klasse zwischen Client und Server und möchte Variabel bleiben, was für Objekte ich übertrage. Das können HashMaps sein, Stacks, Integers, bool, String, was auch immer. Ich möchte nicht für jeden Datentyp ein eigenes Feld haben müssen, darum habe ich hier Object genommen um generisch zu bleiben.
Das payload ist einfach ein Element in params. Ich setze per Command.SetParam(Param.Irgendwas, txtTextFeld.GetText()); einen Wert (als Payload) und serialisiere die Klasse mit gson, schicke sie an den Server oder den Client und deserialisiere sie dort wieder.
Java:
Command.GetParam(Param.Irgendwas,String.class);
gibt mir eben den Fehler, dass ein Object nicht zu einem String gecastet werden kann und
Java:
Command.GetParam(Param.Irgendwas).toString();
gibt mir nicht den gewünschten String sondern eben die Objektinstanz als Namen (java.lang.Object@b9b618).
Senden/Empfangen:
Java:
// SendenGson gson =newGson();String json = gson.toJson(cmd);Main.SendOnSocket(clientConnection, json);// Sendet und flusht// EmpfangenGson gson =newGson();String receive = in.readLine();// in = BufferedReader des Sockets.Command cmd =(Command) gson.fromJson(receive,Command.class);
ist es garantiert das richtige Command, stimmt die Id? wird die von dir beliebig vergeben?
verwende erstmal keine komplizierte Map, sondern übertrage einen Test-String in einem String-Attribut, klappt das?
als nächstes ein Object-Attribut, gehts da?
generell solltest du versuchen, Konventionen einzuhalten, Methoden und Variablen klein schreiben!
Genau das hatte ich zuhause auch schon probiert und ich bin auf viele Schwierigkeiten dabei gestoßen. Ich versuche das Momentan so zu lösen:
anstatt [c]Object[/c] nutze ich [c]String[/c]. Warum? Ich lasse mir einfach aus dem "Objekt" ein JSON-String erzeugen und speichere diesen ab. Ist noch unausgereift, aber so ist derzeit meine idee:
Normal brauchst du da nie selbst mit Reflection rummachen, das macht gson schon selbst! Du musst ihm halt nur genau sagen was du machen willst! Am Besten mal den guide durchlesen.
In dem Beispiel von Tomate würde sich evtl. so etwas anbieten ???:L
Das ist mein momentaner Workaround, alles in einen String zu tun und ihn dann einfach zu Integers und booleans zu konvertieren. Hier ist aber das Problem, dass ich keine Stacks<> oder HashMaps<> übermitteln kann, weil es auf Strings beschränkt ist. Wenn es ein Objekt wäre könnte ich einfach meine HashMap der params HashMap hinzufügen.
eRaaaa: das wäre eine Lösung, wenn auch im Gegensatz [c]Object[/c] zu verwenden etwas komplexer. Eine Lösung mit Object wäre ideal imo, aber wenn ich keine Lösung finde, werde ich es warscheinlich so machen. Danke!
Das ist mein momentaner Workaround, alles in einen String zu tun und ihn dann einfach zu Integers und booleans zu konvertieren. Hier ist aber das Problem, dass ich keine Stacks<> oder HashMaps<> übermitteln kann, weil es auf Strings beschränkt ist. Wenn es ein Objekt wäre könnte ich einfach meine HashMap der params HashMap hinzufügen.
Sicher das du mich richtig verstanden hast? Ich meinte: Du willst im Objekt etwas unbekanntes speichern, sei es String, Hashmap oder ieine x-Belibige Referenz. Egal. Dieses Objekt lässt du mittels gson in ein json string umwandeln und übergibst diesen. Ich meine nicht, dass du das tun sollst: String.valueOf(Object).
Durch mein gepostetes Beispiel, sollte das eigentl. klar geworden sein :-/