kops Kops Online PageS

4mai/090

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 ;)

A propos kops

\o/
Commentaires (0) Trackbacks (0)

Aucun commentaire pour l'instant


Laisser un commentaire

Vous devez être connecté pour poster un commentaire

Aucun trackbacks pour l'instant