Serialisierung und Deserialisierung einer HashMap

Status
Nicht offen für weitere Antworten.

zco

Mitglied
Hallo zusammen,

ich versuche nun seit ein paar Stunden vergeblich ein HashMap zu serialisieren/deserialisieren. Mir ist die Vorgehensweise irgendwie nicht ganz klar.

Ic würde das gerne mit dem ObjectOutputStream bzw. ObjectInputStream machen. Dazu gibt es auch einige Beispiele, unter anderem im Java-Insel-Buch oder im Artikel "A Taste of Java's I/O Package: Streams, Files, and So Much More" auf InformIT, welche allerdings immer eine Datei als Zwischenlagerungsmedium verwenden. Ich möchte gerne einen String verwenden. Das heißt ich serialisiere die HashMap in einen String und deserialisiere die Map aus diesem String danach wieder. Aber irgendwie weiß ich nicht so richtig welche Stream-Klassen ich da nehmen muss und wie ich da ran gehe.

Ich hoffe ihr könnt mir helfen.

Viele Grüße,
zco
 
M

maki

Gast
>> Ich möchte gerne einen String verwenden. Das heißt ich serialisiere die HashMap in einen String und deserialisiere die Map aus diesem String danach wieder.

Geht nicht, wäre auch Quatsch.
 

FArt

Top Contributor
maki hat gesagt.:
>> Ich möchte gerne einen String verwenden. Das heißt ich serialisiere die HashMap in einen String und deserialisiere die Map aus diesem String danach wieder.

Geht nicht, wäre auch Quatsch.

Geht schon, bleibt aber Quatsch ;-)
 

zco

Mitglied
danke erstmal für die Antworten.

@maki & FArt: Warum wäre das Quatsch? ???:L

@enemy: schau ich mir grad an, mal sehen ob ich es hinbekomme :)
 
M

maki

Gast
>> Geht schon, bleibt aber Quatsch

Quatsch sollte man verbieten ;)

>> Warum wäre das Quatsch?

Wozu sollte das denn gut sein????
 

zco

Mitglied
@Wozu sollte das denn gut sein?:

Ich glaube ich versuche mal meinen Fall genauer zu beschreiben. :wink:

Ich verwende Project Zero (www.projectzero.org) um einen leichtgewichtigen Web Service zu bekommen. Dort gibt es die Möglichkeit mit Hilfe der Methode GlobalContext.zput(pfad, objekt) ein Objekt in einer Art globaler Speicher zu verwalten. Wenn mein Code nach der Ausführung des Services nun wieder bei mir verarbeitet wird möchte ich gerne das zurückgegebene Ergebnis haben. Mit zput kann ich nur bestimmte Objekte übergeben, wie zum Beispiel eine HashMap, einen String, ... . Die HashMap wir in der Form serialisiert (keine Ahnung wie und mit was) so das folgender String heraus kommt (Beispiel) : [{"name1":"value1"}{"name2":"value2"}]. In meiner naiven Vorstellung dachte ich ich könnte das ganze einfach wieder deserialisieren, sodass eine HashMap heraus kommt.

Zum Vorschlag von enemy mit byte[] daran zu gehen nützt mir leider auch nicht viel, da ich irgendwie den Byte Array übergeben muss. Das mache ich dann als String und damit kommt die Deserialisierung nicht mit klar (logischer Weise).

Ich kann die HashMap also beliebig serialisieren, übergeben tu ich aber einen String. Entsprechend macht es in diesem Fall schon Sinn (kein Quatsch :wink: ) die HashMap derart zu serialisieren und deserialisieren.

Gruß
 

FArt

Top Contributor
enemy hat gesagt.:
object to byte[]
new String(byte[]) xD
Schon wieder Quatsch. Doppelquatsch. Damit handelst du dir Encodingprobleme ein.

Wenn es denn schon sein muss, dann Base64 enkodiert.

Ein wenig schöner: XMLEncoder/XMLDecoder... funktioniert mit allen Beans out of the box...
 

zco

Mitglied
OK, ich nutze jetzt einen ByteArrayOutputStream und einen ObjectOutputStream um eine HashMap<String, String> zu serialisieren. Dann nutze ich die Funktion toByteArray() um das Ergebnis des ByteArrayOutputStream in ein byte[] array zu bekommen, welchen ich dann mit new String(byte[]) zu einem String umwandle. Das sende ich zurück.

Auf der anderen Seite verwende ich einen BufferredReader um den String zu bekommen. Mit string.getBytes() bekomme ich wieder ein byte Array, was ich einem ByteArrayInputStream übergebe. Diesen übergebe ich dann einem ObjectInputStream wo ich versuche mit readObject() die HashMap wieder zu bekommen. Das schlägt jedoch mit der folgenden Exception fehl.

java.io.StreamCorruptedException: invalid stream header
 

FArt

Top Contributor
zco hat gesagt.:
OK, ich nutze jetzt einen ByteArrayOutputStream und einen ObjectOutputStream um eine HashMap<String, String> zu serialisieren. Dann nutze ich die Funktion toByteArray() um das Ergebnis des ByteArrayOutputStream in ein byte[] array zu bekommen, welchen ich dann mit new String(byte[]) zu einem String umwandle. Das sende ich zurück.

Auf der anderen Seite verwende ich einen BufferredReader um den String zu bekommen. Mit string.getBytes() bekomme ich wieder ein byte Array, was ich einem ByteArrayInputStream übergebe. Diesen übergebe ich dann einem ObjectInputStream wo ich versuche mit readObject() die HashMap wieder zu bekommen. Das schlägt jedoch mit der folgenden Exception fehl.

java.io.StreamCorruptedException: invalid stream header

Hast du eine JUnit Test für deine Konvertierung oder bist du mehr für den explorativen Ansatz und lässt andere für dich denken? Vergleiche mal das ursprüngliche Array mit dem Ergebnis und lies meinen letzten Post. Entwickel ein wenig Eigeninitiative.
 
T

tuxedo

Gast
Wo ist denn da das Problem?!

Code:
	HashMap<String, String> beforeMap = new HashMap<String, String>();
	
	beforeMap.put("myKey1", "myValue1");
	beforeMap.put("myKey2", "myValue2");
	beforeMap.put("myKey3", "myValue3");
	
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	ObjectOutputStream oos = new ObjectOutputStream(baos);
	
	oos.writeObject(beforeMap);
	oos.flush();
	
	byte[] serializedMap = baos.toByteArray();
	
	String serializedMapAsString = new String(serializedMap);
	
	System.out.println(serializedMapAsString);
	
	byte[] serializedMapReceived = serializedMapAsString.getBytes();
	
	ByteArrayInputStream bais = new ByteArrayInputStream(serializedMapReceived);
	ObjectInputStream ois = new ObjectInputStream(bais);
	HashMap<String, String> afterMap = (HashMap<String, String>) ois.readObject();
	
	System.out.println(afterMap.get("myKey1"));
	System.out.println(afterMap.get("myKey2"));
	System.out.println(afterMap.get("myKey3"));

Alles worauf du achten musst, ist das String-Encoding. Solltest halt sicherstellen dass auf beiden Seiten das gleiche Encoding benutzt wird und es sich unterwegs nicht ändert oder "Sonderzeichen" eliminiert werden ...

- Alex
 
E

enemy

Gast
@FArt, schon wieder? habe ich noch irgendwo was 'unsinniges' geschrieben?

ich sehe aber schon, da ist jemand sehr von sich überzeugt und wirft gern mit großen worten rum...
 

FArt

Top Contributor
enemy hat gesagt.:
@FArt, schon wieder? habe ich noch irgendwo was 'unsinniges' geschrieben?
Kann schon sein, bei den Gästen kann man das ja nicht so einfach nachvollziehen... *G*

Nichts desto trotz: dein Ansatz ist suboptimal, weil inkonsistent, besonders weil du nicht in der Hand hast wo der String dann alles verarbeitet wird => Quatsch. Der Quatsch wird nicht geringer, nur weil der Fehler nicht sofort offenbar wird.
 

zco

Mitglied
Hi Alex,

ich mache es praktisch genauso wie du (sogar schon bevor du mir deinen Code geschickt hast), abgesehen von den Variablennamen :wink: . Trotzdem bekomme ich die Exception. Wenn ich mir den die Bytes ausgeben lasse habe ich folgendes:

"\u00ac\u00ed\0\u0005sr\0\u0011java.util.HashMap\u0005\u0007\u00da\u00c1\u00c3\u0016`\u00d1\u0003\0\u0002F\0\nloadFactorI\0\tthresholdxp?@\0\0\0\0\0\fw\b\0\0\0\u0010\0\0\0\u0004t\0\u00014t\0\u0006fourtht\0\u00013t\0\u0005thirdt\0\u00012t\0\u0006secondt\0\u00011t\0\u0005firstx"

Da steht sogar HashMap drin, aber wie gesagt, wieder: java.io.StreamCorruptedException: invalid stream header

Ich habe das serialisierte Ergebnis mit dem String vor der Deserialisierung verglichen. Diese sind identisch. Also sollte "unterwegs" nichts verloren gegangen sein.

@FArt: Sorry das es vllt. so rüberkommt, das ich andere denken lasse. Dem ist aber nicht so, denn es nützt mir ja nichts wenn ich es selbst nicht begreife. Was die Eigeninitiative anbelangt weiß ich nicht was ich noch mehr machen sollte außer gestern Abend 4 Stunden und heute schon den ganzen Tag mich damit zu beschäftigen. Was deinen Vorschlag mit XMLEncoder/XMLDecoder anbelangt bin ich noch dabei das auszuprobieren. Bin nunmahl nicht der schnellste...
 
T

tuxedo

Gast
>> Ich habe das serialisierte Ergebnis mit dem String vor der Deserialisierung verglichen. Diese sind identisch.

Irgendetwas MUSS an dem String anders sein, sonst würde es ja klappen (mein Codesample ist immerhin lauffähig). Versuch das ganze doch erstmal lokal als Dummy zum laufen zu kriegen und erweitere das ganze dann Stück für Stück. Wenn du bytes in einen String wandelst und später wieder zurück, solltest du, wenn du verlgleichst, nicht auf String-Ebene vergleichen, sondern auf byte-Ebene Also VOR dem in String wandeln, und NACH dem von String in Byte wandeln...



@FArt:

Dein Einwand ist also, dass man es nicht in der Hand hat wer den String alles noch manipuliert, umformt etc?! Naja. Finde das ist Ansichtssache. Ein String ist ja auch nix weiter als eine (terminierte) Byte-Folge.

Wenn ich das mit dem String weglasse, lasse ich das Wörtchen "String" und das mit dem "terminiert" weg. Es ist und bleibt doch aber eine Byte-Folge. Und die kann ich unterwegs genausogut manipulieren und umformen/konvertieren.

Wenn auf beiden Seiten die gleiche "Sprache" gesprochen wird, sollte String oder Nicht-String keine Rolle spielen.

- Alex
 

FArt

Top Contributor
tuxedo hat gesagt.:
Wenn auf beiden Seiten die gleiche "Sprache" gesprochen wird, sollte String oder Nicht-String keine Rolle spielen.
- Alex
Genau das ist ja das Problem. Sobald ich die Zeichenkette auf einem System verarbeite, welches ein anderes Encoding benutzt, ist u.U. alles hinüber. Da kann ich beim hin- und zurückwandeln das gleiche Encoding verwenden, zwischendurch kann der Text bei "unsachgemäßer" Verbeitung und Speicherung unwiederbringlich verhunzt werden.
Hier wird wohl der Webservice und/oder der Zugriff darauf schuld sein.

Ich verwende Project Zero (www.projectzero.org) um einen leichtgewichtigen Web Service zu bekommen. Dort gibt es die Möglichkeit mit Hilfe der Methode GlobalContext.zput(pfad, objekt) ein Objekt in einer Art globaler Speicher zu verwalten. Wenn mein Code nach der Ausführung des Services nun wieder bei mir verarbeitet wird möchte ich gerne das zurückgegebene Ergebnis haben. Mit zput kann ich nur bestimmte Objekte übergeben, wie zum Beispiel eine HashMap, einen String, ... . Die HashMap wir in der Form serialisiert (keine Ahnung wie und mit was) so das folgender String heraus kommt (Beispiel) : [{"name1":"value1"}{"name2":"value2"}]. In meiner naiven Vorstellung dachte ich ich könnte das ganze einfach wieder deserialisieren, sodass eine HashMap heraus kommt.

Wetten, dass wir hier um das Problem diskutieren, das mehrfach als Quatsch bezeichnet wurde? Liege ich falsch, gebe ich dir ein Bier aus ;-)
... auch zwei...
 
T

tuxedo

Gast
>> Genau das ist ja das Problem. Sobald ich die Zeichenkette auf einem System verarbeite, welches ein anderes Encoding benutzt, ist u.U. alles hinüber.

Klar. So ganz die piek feine Sache ist es nicht Daten als String zu handhaben. Aber es gibt ja für alles einen sinnvollen Verwendungszweck und ebenso einen nicht sinnvollen.

Wenn man es nicht in der Hand hat, wer alles den String noch in die Hand bekommt und damit herumhantiert (so viel Hand ... :autsch: ), dann sollte man wohl von der String-Lösung abstand nehmen...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Serialisierung und Deserialisierung von Objekten - Frageprogramm Allgemeine Java-Themen 4
E Serialisierung - Deserialisierung Allgemeine Java-Themen 4
antonia09 Einkaufszettel Persistenz und Serialisierung Allgemeine Java-Themen 6
R Datentypen Korrekte integer in Hex ASCII Konvertierung und serialisierung Allgemeine Java-Themen 1
M Serialisierung funktioniert nicht Allgemeine Java-Themen 9
Z Best Practice Serialisierung Allgemeine Java-Themen 2
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
M Alternative zur Serialisierung.. Protobuf? Allgemeine Java-Themen 9
Thallius Serialisierung schlägt fehl. Allgemeine Java-Themen 3
M Serialisierung & Verschlüsselung Allgemeine Java-Themen 2
E Serialisierung - Sinn einer generierten serialVersionUID? Allgemeine Java-Themen 4
V Serialisierung von Instanz eigener Klasse Allgemeine Java-Themen 5
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
K Serialisierung einer verschachtelten Datenstuktur Allgemeine Java-Themen 9
Tobse Input/Output Dateiformat: Serialisierung VS Custom format Allgemeine Java-Themen 6
A Problem bei Serialisierung von Bibliotheks-Klassen Allgemeine Java-Themen 6
A Input/Output Serialisierung Sonderzeichen Allgemeine Java-Themen 3
P Serialisierung der Oberklasse Allgemeine Java-Themen 2
Kr0e Circular reference - Serialisierung Allgemeine Java-Themen 6
K Serialisierung in Properties-Datei möglich? Allgemeine Java-Themen 3
B Serialisierung mit Unterobjekten über Netzwerk Allgemeine Java-Themen 3
C Serialisierung - Standardwert für nachträglich hinzugefügtes Feld Allgemeine Java-Themen 2
S Serialisierung der Kindklasse Allgemeine Java-Themen 5
K Serialisierung komplett selbst machen Allgemeine Java-Themen 13
C Serialisierung ohne Serializable Allgemeine Java-Themen 4
S Serialisierung und Referenzen Allgemeine Java-Themen 6
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
E Objekt bei Serialisierung ändern Allgemeine Java-Themen 2
Q Serialisierung / Speicherung Geschwindingkeit & Aktuelle Position Allgemeine Java-Themen 7
W Serialisierung Allgemeine Java-Themen 6
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
F Serialisierung und Obfuscation? Allgemeine Java-Themen 7
G (De)serialisierung und Referenzen Allgemeine Java-Themen 5
T Serialisierung: Wie macht RMI das so schnell? Allgemeine Java-Themen 14
J Serialisierung: readInt + writeInt Allgemeine Java-Themen 4
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
J bean + serialisierung + serialVersionUID Allgemeine Java-Themen 3
K Serialisierung Allgemeine Java-Themen 6
thE_29 Wie funktioniert Serialisierung? Allgemeine Java-Themen 10
S Problem mit Serialisierung Allgemeine Java-Themen 2
C Serialisierung von JComboBox Allgemeine Java-Themen 4
W Deserialisierung und Ausführung Allgemeine Java-Themen 2
woezelmann Object nach Deserialisierung nicht mehr gleich Allgemeine Java-Themen 13
S Deserialisierung EOF Allgemeine Java-Themen 5
G Deserialisierung funktioniert n. Refaktorisierung nicht mehr Allgemeine Java-Themen 10
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben