Sérialisation

Exportation des objets en dehors de l'environnement Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

La persistance des objets en Java ressemble énormement à celle en PHP. Elle se repose sur le processus de sérialisation.

La sérialisation est une sorte de traduction d'un objet en une chaîne de caractères intéprétable par un algorithme de sérialisation. Cependant, pas toutes les classes peuvent être sérialisées. Uniquement celles qui implémentent l'interface Serializable peuvent l'être.

Un objet est serialisé afin de le transmettre à une autre action immédiatement ou dans l'avenir. Il peut également être utilisé en tant qu'un mécanisme de copie de sécurité. Regardons l'exemple de l'utilisation sur la représentaton de l'objet Water sauvegardé dans un fichier .txt :

afficher le code

Voici le résultat :

File was correctly saved as water.serialized
Found hot water

Cependant, il y a quelques régles d'une sérialisation sécurisée à respecter :
- Une possibilité de corrompre le flux de sérialisation existe. C'est pourquoi il est important de préserver les données sensibles de la sérialisation.

On peut éliminer ces variables de la sérialisation en utilisant le mot-clé transient et en les rendant privées (par exemple : private transient String nameProtected).

Une autre méthode de définir les variables à sérialiser est l'utilisation du serialPersistentFields() qui regroupe les attributs pouvant être sérialisés.

Regardons l'utilisation de ces deux méthodes dans cet exemple :

afficher le code


- Un autre danger, celui de lecture par un utilisateur non-autorisé existe également. Afin de se protéger contre cette action, l'objet sérialisé peut être également crypté.
- L'objet peut aussi être victime d'une attaque de remplacement. Imaginons que l'attaquant arrive à accéder au fichier contenant l'objet sérialisé. Cet objet représente une instance de la classe User qui possède un champ précisant s'il s'agit d'un administrateur ou pas. La solution repose sur le fait de surcharger les méthodes de sérialisation (writeObject()) et de déserialisation (readObject()).

L'idée peut être illustrée par cet exemple :

afficher le code

Le résultat retourné sera :

File was correctly saved as user.serialized
Found User object :User objetct : login=mod,code=administrator
User can access to this page ? false

- Si l'objet serialisé contient des références à d'autres objets, il vaut mieux privilégier la méthode writeUnshared() et readUnshared() qui garantissent l'écriture et la lecture uniques de ces références.

Bartosz KONIECZNY Standards du codage

Une question ? Une remarque ?

*

*

Un conseil Symfony2

Un problème filemtime()

Si pendant le développement de votre projet Symfony2 vous rencontrez un problème avec fonction filemtime, il peut s'agir d'un dysfonctionnement temporaire. Warning: filemtime() [function.filemtime]: stat failed for C:\Program Files (x86)\EasyPHP-5.3.5.0\www\gagu\src\Bun\DleBundle/Resources/views/Bundle/show.html.php in C:\Program Files (x86)\EasyPHP-5.3.5.0\www\appli\app\cache\dev\classes.php line 2064 Pour résoudre ce problème, vous pouvez être amenés à supprimer le cache du répertoire dev (si vous êtes en mode développement).