La sérialisation en Java
Je passe une soirée à glander avant de passer aux choses sérieuses... et je me dis que je vais sérialiser mes objets Java à la main pour mon projet Asyd. Il suffit d'implémenter l'interface Externalizable et de jouer avec les flux :
public void writeExternal(ObjectOutput out) throws IOException { ByteArrayOutputStream bout = new ByteArrayOutputStream(); DataOutputStream dout = new DataOutputStream(bout); dout.writeInt(2); dout.writeUTF("muahaha"); out.writeInt(bout.size()); GZIPOutputStream gzout = new GZIPOutputStream((OutputStream) out); gzout.write(bout.toByteArray()); gzout.finish(); }
Ci-dessus on applique un coup de compression GZip sur les données qu'on écrit, pratique pour les objets qui ont beaucoup d'informations à sérializer.
Et pour désérializer, il ne reste plus qu'à faire la même chose dans l'autre sens :
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { int size = in.readInt(); GZIPInputStream gzin = new GZIPInputStream((InputStream) in); byte[] data = new byte[size]; byte[] buf = new byte[1024]; int len; while (len = gzin.read(buf) != -1) { System.arrayCopy(buf, 0, data, len); } ByteArrayInputStream bin = new ByteArrayInputStream(data); DataInputStream din = new DataInputStream(bin); int deux = in.readIn(); String muahaha = in.readUTF(); }
Mouais, ça a l'air bien ennuyant pour pas grand chose... Voyons ce que ça donne. Ma classe représente un dossier et contient dans un tableau de string tous les sous fichiers/dossiers.
| Nombre de sous dossiers/fichiers | Sérialisation par défaut | Sérialisation à la main |
|---|---|---|
| 6 | 757 octets | 161 octets |
| 38 | 2,3 Ko | 360 octets |
| 232 | 14 Ko | 3,4 Ko |
Ça marche plutot bien dans tous les cas
Aucun commentaire pour l'instant
Laisser un commentaire
Vous devez être connecté pour poster un commentaire
Aucun trackbacks pour l'instant