OVH Cloud OVH Cloud

serialization et déserialization

6 réponses
Avatar
frandicz
Bonjour,

J'aimerais enregistrer un talbeau associatif sans trous (HashMap) dans
une base SQL. Pour cela, j'ai besoin de le stocket sous forme de chaine
(dans ce sens je serialize), et ensuite de deserializer pour obtenir un
HashMap depuis un String.

J'arrive bien à serializer avec ceci:
--
String str;
HashMap hm = new HashMap();
// remplir le Hash map
hm.put("nom", "durand");
hm.put("prenom", "rené");
str = hm.toString();
--

J'obtiens ceci:
{nom=durand, prenom=rené}

Mais je ne sais absolument pas comment retrouver mon HashMap depuis le
String ! Je suis tombé sur des fonctions de deserialization readObject
qui prennent toutes des flux !

Merci d'avance.

6 réponses

Avatar
Rémi Cocula
Mais je ne sais absolument pas comment retrouver mon HashMap depuis le
String ! Je suis tombé sur des fonctions de deserialization readObject
qui prennent toutes des flux !

Merci d'avance.


Il faut parser la chaine je suppose.

Voila un code qui marche.

public class testparse {

public static void main (String args[]) {
String str;
HashMap hm = new HashMap();
hm.put("nom", "durand");
hm.put("prenom", "rené");
str = hm.toString();
System.out.println(hm);

HashMap hm2 = new HashMap();
String tmp = str.substring(1,str.length()-1);
StringTokenizer st = new StringTokenizer(tmp,", ");
while (st.hasMoreTokens()) {
StringTokenizer st2 = new StringTokenizer(st.nextToken(),"=");
hm2.put(st2.nextToken(),st2.nextToken());
}

System.out.println(hm2.toString());
}

}

Avatar
ownowl
frandicz wrote:
Bonjour,

J'aimerais enregistrer un talbeau associatif sans trous (HashMap) dans
une base SQL. Pour cela, j'ai besoin de le stocket sous forme de chaine
(dans ce sens je serialize), et ensuite de deserializer pour obtenir un
HashMap depuis un String.

J'arrive bien à serializer avec ceci:
--
String str;
HashMap hm = new HashMap();
// remplir le Hash map
hm.put("nom", "durand");
hm.put("prenom", "rené");
str = hm.toString();
--

J'obtiens ceci:
{nom=durand, prenom=rené}

Mais je ne sais absolument pas comment retrouver mon HashMap depuis le
String ! Je suis tombé sur des fonctions de deserialization readObject
qui prennent toutes des flux !

Merci d'avance.


Et pourquoi ne pas serializer directement l'Object HashMap (hm)

Avatar
flure
Et pourquoi ne pas serializer directement l'Object HashMap (hm)


Et pourquoi ne pas implémenter l'interface Serializable ? Ensuite il
suffit de passer par un ObjectInputStream pour déserialiser et un
ObjetOutputStream pour sérialiser ...

Bon, ok, je n'ai pas trouvé cela tout seul, c'est dans "Thinking in
Java" de Bruce Eckel ...


--
Florent "flure" C.
http://flure.free.fr

Avatar
ownowl
flure wrote:

Et pourquoi ne pas serializer directement l'Object HashMap (hm)



Et pourquoi ne pas implémenter l'interface Serializable ? Ensuite il
suffit de passer par un ObjectInputStream pour déserialiser et un
ObjetOutputStream pour sérialiser ...


absolument, sauf qu'il est inutile implementer l'interface Serializable
car HashMap l'implemente déjà

Bon, ok, je n'ai pas trouvé cela tout seul, c'est dans "Thinking in
Java" de Bruce Eckel ...





Avatar
flure
absolument, sauf qu'il est inutile implementer l'interface Serializable
car HashMap l'implemente déjà


Ah ok, désolé je ne savais pas :)

--
Florent "flure" C.
http://flure.free.fr

Avatar
Sébastien
frandicz wrote:

Bonjour,

J'aimerais enregistrer un talbeau associatif sans trous (HashMap) dans
une base SQL. Pour cela, j'ai besoin de le stocket sous forme de chaine
(dans ce sens je serialize), et ensuite de deserializer pour obtenir un
HashMap depuis un String.

J'arrive bien à serializer avec ceci:
--
String str;
HashMap hm = new HashMap();
// remplir le Hash map
hm.put("nom", "durand");
hm.put("prenom", "rené");
str = hm.toString();
--

J'obtiens ceci:
{nom=durand, prenom=rené}

Mais je ne sais absolument pas comment retrouver mon HashMap depuis le
String ! Je suis tombé sur des fonctions de deserialization readObject
qui prennent toutes des flux !

Merci d'avance.


S'appuyer sur la méthode toString() pour sérialiser un objet n'est pas propre et franchement
dangereux (elle n'a rien de standard et peut changer).
Il serait mieux que tu surcharge le writeObject et le readObject en étendant HashMap.
Tu peux aussi te créer 2 méthodes utilitaires pour transformer une Map en string et inversement.
Tout dépend du contexte d'utilisation.

Sébastien