Java fournit un mécanisme appelé sérialisation.
Par conséquent, si nous avons sérialisé un objet, il peut être lu et désactivé via le type d'objet et d'autres informations, et obtient enfin le prototype de l'objet.
ObjectInputStream et ObjectOutStream Les objets sont des objets de streaming de niveau élevé, y compris la sérialisation et les méthodes de dos séquentielles.
ObjectOutStream a de nombreuses méthodes pour les objets sérialisés.
Private void writeObject (ObjectOutputStream OS) lève IOException {}
ObjectInputStream similaire fournit les méthodes suivantes:
La marque de void privée (ObjectInputStream IS) lève IOException, classNotFoundException {}
Alors, où doit-il être sérialisé? La sérialisation utilise généralement des données de transmission de réseau ou enregistre des objets dans les fichiers. Les données mentionnées ici sont un objet et non un texte.
Le problème est maintenant que notre architecture de réseau et notre disque dur ne peuvent identifier que les binaires et les octets, et ne peuvent pas reconnaître les objets Java.
La sérialisation consiste à traduire la valeur / états de l'objet Java en octets pour transmettre ou enregistrer via le réseau. De plus, la sérialisation de dépendance consiste à lire le code d'octets et à la traduire dans l'objet Java.
Concept SerialVersionUid
SerialVersionUid est utilisé pour garantir le même objet (qui peut être utilisé dans la sérialisation) peut être chargé pendant le processus de désérialisation. SerialVersionUID est un contrôle de version pour les objets. Vous pouvez vous référer à SerialVersionUid dans Java Serialization pour obtenir plus d'informations.
Pour la sérialisation:
Les étapes sont les suivantes:
Voyons une liste:
Créer un employee.java dans src-> org.arpit.javaposts
1. employee.java
Package Org.Arpit.JavapostSForning; = EmployeeId;} public String getEmployeename () {return EmployeeEName;} public void setEmployeename (String employeename) {this.employeena me = employeename;} public string getDeppartement () {return Department;} public void setDepment (String Department) {this. Depapartment = Department;}}
Comme vous pouvez le voir, si vous avez besoin de sérialiser n'importe quelle classe, vous devez implémenter l'interface sérialisable.
L'interface de marqueur dans Java est une interface sans champ ou méthode.
2.Serializemain.java
package org.arpit.javaposts ] Args) {Employee Emp = New Employee (); Emp.SetEmployEid (101); ser "); objectputStream outstream = new ObjectPutStream (fileout); outstream.writeObject (emp); outstream.close (); exception i) {i.printStackTrace ();}}}
Pour le dos-séquentisation:
L'étape est
Dans le package src-> org.arpit.javapostsforlearning, créez desserializemain.java
3.Deserializemain.java
Package Org.Arpit.JavapostsForning; Null; Try {FileInputStream FileIn = new FileInputStream ("Employee.Ser"); IoException i) {i.PrintStackTrace ();} Catch (classNotFoundException c) {System.out.println ("Employeeeeeeeeeee"); ... "); System.out.println (" Emp id: "+ emp.getEmployeeId ()); System.out.println (" Name: "+ emp.getEmployEename ()); stem.out.println (" Département: "+ emp.getDeppartment ());}}
4. Run:
Exécutez d'abord le Serializemain.java, puis exécutez le Deserializemain.java, vous obtiendrez les résultats suivants:
Emblayee désérialisé ... empi
De cette façon, nous avons sérialisé un objet employé et l'avons effectué. Cela semble simple, mais s'il contient des références d'objets et l'héritage, la situation sera compliquée. Jetons un coup d'œil aux exemples un par un pour voir comment réaliser la sérialisation à diverses occasions.
Cas 1 -Si l'objet cite d'autres objets, que dois-je faire
Nous avons déjà vu les exemples basés sur la séquence les plus simples. Comment pouvons-nous sérialiser? L'objet cité sera-t-il également sérialiser? Oui, vous n'avez pas besoin d'être explicitement sérialisé. Lorsque vous sérialisez n'importe quel objet, s'il contient des objets de référence, la sérialisation Java sérialisera automatiquement l'ensemble du diagramme d'objet de l'objet. Par exemple, l'employé cite désormais un objet d'adresse et l'adresse cite également d'autres objets (par exemple, à la maison), puis lorsque vous sérialisez l'objet employé, tous les autres objets cités, tels que l'adresse et la maison, seront automatiquement sérialisés par sérialisation. Créons la classe d'adresse et ajoutons l'objet de l'adresse comme référence pour l'ajouter à la classe des employés.
Employee.java:
Package Org.Arpit.Javapost This.employeeid = employeeId;} public String getEmployeename () {return EmployeeEename;} public void SetEmpoloyEename (String employeename) {this.emPlayEename = EmployeeEename;} public String getDeppartment () {return Department;} public Void setDeppartment (String Department) { This.department = département;} Adresse publique getAddress () {return adresse;} public void setAddress (adresse d'adresse) {this.address = adresse;
在org.arpit.javapostsforlearning 包中,创建Address.java
Adresse.java:
Package Org.Arpit.Javapost this .City = City;} public int Gethomeno () {return homeno;} public void sethomeno (int home) {this.homeno = homeno;} public stringststreet () {street;} public void setStreet (String street) {this. Street = Street;} public String getCity () {return City;} public void setCity (String City) {this.city = ville;}}
Dans Org.arpit.JavapostsForlerning, créez un SerializedEeSerializemain.java
SerializeseeSerializemain.java:
Package org.arpit.javapost Mandliya * / public static void Main (String [] args) {Employee Emp = New Employee (); 88, "MG Road", "Pune"); Emp.SetAddress (adresse); Close ();} Catch (ioException i) {i.printStackTrace ();} / désérialiser EMP = l; (Employé) dans.reamObject (); Employé désérialisé ... "); System .out.println (" Emp id: "+ emp.getEmployEid ()); System.out.println (" name: "+ emp.getEmployeename ()); mp.getDepartement () );
Exécutez-le:
Lorsque vous exécutez SerializeseeSerializemain.java. Vous obtiendrez un tel résultat:
java.io.NotSerializableException: org.arpit.javapostsforning.address sur java.io.objectputtream.writeObject0 (source inconnue) à java.i o.objectputstream.defaultwriteFields (source inconnue) à java.io-objectStream.writerialdata (Source Unknowne sur java.io.objectputStream.writeOrDinaryObject (source inconnue) sur java.io.objectputtream.writeObject0 (source inconnue) sur java.io.ob.ob jectoutputStream.writeObject (source inconnue)
Nous expliquerons où il est faux. J'ai oublié de dire que la classe d'adresse doit également être sérialisable. Ensuite, la classe d'adresse doit hériter de l'interface Serialzable.
Adresse.java:
Importer Java.io.Serializable; .City = City;} public int Gethomeno () {return homeno;} public void Sethomeno (int homeno) {this.homeno = homeno;} public stringStreet () {) return street;} public void SetStret (String street) {this this .Street = Street;} public String getCity () {return City;} public void setCity (String City) {this.city = ville;}}}
Courez à nouveau:
Lorsque vous exécutez à nouveau SerializeseeSerializemain.java. Vous pouvez obtenir les résultats suivants
Emblayee désérialisé ... EMP ID: 101Name: ArpitdePartment: CSCITY: Pune
Cas 2: Si nous ne pouvons pas accéder au code source de l'objet de référence (par exemple, vous ne pouvez pas accéder au code source de la classe d'adresse ci-dessus)
Si nous ne pouvons pas accéder à la classe d'adresse, comment pouvons-nous implémenter l'interface sérialisable dans la classe d'adresses?是否有另外的途径来实现呢? Oui, vous pouvez créer une autre classe, hériter de l'adresse, puis laisser hériter de l'interface sérialisable, mais pour la situation suivante, cette solution échouera:
Si la classe de référence est définie comme la finale
Si la classe de référence fait référence à un autre objet non sérialisé
Alors, comment pouvons-nous sérialiser l'objet employé? La solution consiste à marquer la transition. Si vous n'avez pas besoin de sérialiser un champ, marquez-le simplement comme transitoire.
Adresse d'adresse transitoire
Dans la classe des employés, une fois l'adresse marquée en tant que transitoire, exécutez le programme. Vous obtiendrez NullPointerException, car la référence d'adresse sera nul pendant le processus de profondeur.
Cas 3 -QU'UH si j'ai encore besoin de sauvegarder l'état de l'objet de référence? (Par exemple, Address Object)
Si vous avez marqué l'adresse comme transitoire pendant le processus de profondeur, il renverra le résultat nul. Mais si vous devez toujours enregistrer son état, vous devez sérialiser l'objet d'adresse. La sérialisation Java fournit un mécanisme.
Employee.java:
Package Org.Arpit.Javapost Adresse; ;} Public String getDepapartment () {return Department;} public void setDepartment (String Department)} Adresse publique getAddress () {return adresse;} public void setAddress (adresse d'adresse) {this.address = adresse;} private void writeObject (objectoutStream OS) lance ioException, classNotFoundException {try {os.defaultwriteObject (); O. S.WriteInt (adresse.Gethomeno ()); ;}} Private void readObject (objectInputStream est) lance ioExcetion FoundException {try {is.defaulTreadObject (); .ReadObject (); Adresse = nouvelle adresse (Homeno, rue, ville);} Catch (exception e) {e.printStackTrace ();
Une autre chose à garder à l'esprit, ObjectInputStream lit l'ordre des données de ObjectOutputStream.
Créer Adresse.java
Adresse.java:
Package Org.Arpit.JavapostForning; = Street; This.Street = Street;} public String getCity () {return City;} public void setCity (String City) {this.city = City;
Créer SerializedEeSerializemain.java
SerializeseeSerializemain.java:
Package org.arpit.javapost Mandliya * / public static void Main (String [] args) {Employee Emp = New Employee (); 88, "MG Road", "Pune"); Emp.SetAddress (adresse); Close ();} Catch (ioException i) {i.printStackTrace ();} / désérialiser EMP = l; (Employé) dans.reamObject (); Employé désérialisé ... "); System .out.println (" Emp id: "+ emp.getEmployEid ()); System.out.println (" name: "+ emp.getEmployeename ()); mp.getDepartement () );
courir:
Lorsque vous exécutez SerializedEseRializemain.java.
Emblayee désérialisé ... EMP ID: 101Name: ArpitdePartment: CSCITY: Pune
Maintenant, nous obtenons l'état de l'objet d'adresse, tout comme avant qu'il ne soit sérialisé.
Héritage dans la sérialisation:
Voyons maintenant comment l'héritage affecte la sérialisation. Peu importe si la classe parent est sérialisée, cela conduira à de nombreux exemples. Si la classe parent n'est pas sérialisée, que ferons-nous et comment cela fonctionne. Jetons un coup d'œil à l'exemple.
Nous créerons une personne.java en tant que classe parent de l'employé.
Cas 4: Si la classe parent est sérialisée
Si la classe parent peut sérialiser, toutes les classes d'héritage seront sérialisées.
Cas 5: Et si la classe parent n'est pas sérialisée?
Si la classe parent n'est pas sérialisée, nos méthodes de traitement seront très différentes.
Si la classe parent n'est pas sérialisée, elle ne doit pas avoir de fonction de constructeur de paramètres.
Personne.java
Package Org.Arpit.JavapostsForning; Super (); ;} Public void setNationality (String Nationality) {this.nationality = nationality;}}
Créer un employé.java
Employee.java:
Package org.arpit.javapost .EmployeeId = EmployeeId; department;} Public void SetDepPartment (String department) {this.Deppartment = department;}}
Créer SerializedEeSerializemain.java
SerializeseeSerializemain.java:
Package org.arpit.javapost Mandliya * / public static void Main (String [] args) {// sérialiser EmployeeE EMP = New Employee (101, "Arpit", "Indian"); .println ("Emp id:" + emp.getEmployeid ()); getDeppartment ()); ))) *******. ;} Catch (ioException I) {i.PrintStackTrace ();} Catch (classNotFoundException c) {System.out.println ("Employeee Found"); (After Serializing "); "Département:" + emp.getDeppartment ());
courir:
Lorsque vous exécutez le SerializeseeSerializemain.java, vous obtiendrez la sortie suivante. Ici, le nom est hérité en personne, donc pendant le processus de profondeur, le nom sera initialisé à la valeur par défaut.
Cas 6 -Si la classe parent est sérialisée, mais vous n'avez pas besoin de hériter de la classe comme sérialisé
Si vous ne voulez pas hériter de la classe pour sérialiser, vous devez implémenter les méthodes writeObject () et readObject (), et devez jeter l'anomalie de NotSerializableException.
Cas 7 -Can peuvent-ils sérialiser les variables statiques?
ne peut pas. Parce que les variables statiques sont des niveaux de classe, pas des niveaux d'objet.
Résumer: