Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir les écrans? –Comment programmer les évènements? –Comment développer une application en java? Les Threads ou les processus légers –Quest ce que la programmation parallèle. –Comment programmer les processus en java Les Applets : java sur le Web. –Comment utiliser java pour programmer vos pages.
Exemple Entrée/Sortie Sérialisation
problématique La portée de chaque variable est limitée au bloc de déclaration. A la fin de lapplication, les variables (objets) sont détruites par le GarbageCollector (perte de données). Certaines variables ou objets (pour des raisons applicatives) doivent persister à la fin du programme.
Exemple: gestion des employés On veut écrire un programme de saisie demployés. Solution: Class Employé Nom Prénom Adress …. ListPersonnels Employé[] list Add(Employé) Remove(Employé) Public static void main(String[] args) {ListPersonel base= new ListPersonel(); boolean fin=false; While(!fin) {// lire les données de lemployé data base.add(new Employé(data)); // lire décision de poursuite de lutilisateur fin= decision; } }// fin main piletas base ListEmployé liste Employé[] Employé ….. piletas base ListEmployé liste Employé[] Employé …..
Solution: Trouver le moyen de persister les données. Solution : utiliser un fichier pour stocker les données: –Définir un modèle de stockage des Objets –Définir le moyen de restauration des Objets –Exemple: public class MyClass { public void saveYourself(Writer o) throws IOException { … } public static MyClass loadYourself(Reader r) throws IOException { … } } InputStream ou FileWriter OutputStream ou FileReader
Limite de cette solution Le stockage de lobjet passe par le stockage de ses données membres. Chaque Objet membre doit appartenir à une classe qui implémente le même mécanisme. Impossible de passer par les interfaces (la méthode de restauration doit être static). La solution devient très complexe pour gérer les références
Problème de reférence emp loyé 1 emp loyé 2 emp loyé 3 Employé1 …… Patron: Employé3 …….. Employé2 …… Patron: Employé3 …….. Employé3 …….. emp loyé 1 emp loyé 2 emp loyé 3 Emp1. saveYourself(Writer o) Emp2. saveYourself(Writer o) Emp1=Employé.loadYourself(Reader r) Emp2=Employé.loadYourself(Reader r) Emp3=Employé.loadYourself(Reader r) empl oyé4
La sérialisation Le mécanisme offert par Java pour persister les données. Un format uniforme pour formater les objets sous forme dune séquence doctets. Il gère le problème de référence. Offre dautres mécanismes de personnalisation
Les Conditions nécessaires Le type de lobjet (Class) doit être déclaré public La classe doit disposer dun constructeur à zéro paramètres La classe doit implémenter linterface Serialisable Toutes les données membre doivent être « sérialisable »: type primitive ou des classes qui implémentent Serialisable. Les données membres static et static final ne sont pas sauvegardées
Implémentation de linterface Serializable Implémenter une interface induit à limplémentation de ses méthodes, Mais… Serializable ne définit aucune méthode. –Question1: A quoi sert une interface sans méthodes? –Réponse: Serialisable est une interface drapeau qui informe lenvironnement Java pour traiter la Classe de manière particulière. –Question2: pourquoi toutes les classes nimplémentent pas Serializable par défaut ? –Réponse: problème de sécurité (voire la suite).
Sérialiser un Object La Classe ObjectOutputStream. Elle prend en paramètre un OutputStream Utilise la méthode writeObject(Object) public class employé implements Serializable{………} ……… public class Sauvgarder{ public static void main(){ Employé emp1=new Employé(………); ObjectOutputStream out=new ObjectOutputStream( new FileOutputStream(fileName)) out.writeObject(emp1); Out.close …………}}
Restaurer un objet (« de-sérialiser ») Faut savoir à lavance le type de lobjet. Utilisé la classe ObjectInputStream. Prend un object InputStream. Utilise la méthode readObject(). Type de retour Object. Il faut savoir le type (pour le transtypage). Vous pouvez utiliser la méthode. getClass() pour savoir le type effectif. ObjectInputStream in= new ObjectInputStream( new FileInputStream(fileName)); Employé emp1=((Employé)in.readObject();
Exemple: problème de référence emp loyé 1 emp loyé 2 emp loyé 3 emp loyé 2 ObjectOutputStream out=new ObjectOutputStream( new FileOutputStream(fileName)) out.writeObject(emp1); out.writeObject(emp2); out.writeObject(emp3); Employé3 …….. Patron:null 2 2 Employé1 …… Patron: 1 Employé2 …… Patron: 3 2 ObjectInputStream in=new ObjectOutputStream( new FileInputStream(fileName)) emp1= ((Employé)in.readObject()); emp2= ((Employé)in.readObject());// ne crée pas dobjet emp3= ((Employé)in.readObject()); emp loyé 1 emp loyé 3 emp1 emp2 emp3
Aspects avancés Sécurité: –Une objet sérialisé est un fichier UTF(texte). –Un objet sérialisé peut être lu et modifié. le mot clé transient –Certaines données (non static) ne doivent pas être stockées (les valeurs calculées, mot de passe) –Le mot clé transient informe java de ne pas sérialiser la variable en question. public class Employé implements Serializable { ……………… private transient double salaire; // le salaire ne sera pas sérialisé}
En résumé: Désormais, il est possible de sauvegarder les variables objets. Implémenter linterface Serialisable Utilisez ObjectInputStream & ObjectOutputStream pour stocker et restaurer les objets. Les objets restaurés sont de type Object (transtypage). Faites attention lors de lhéritage, les classes mères doivent avoir des contructeurs à zéro paramètres……