
Java fournit un mécanisme appelé sérialisation d'objet où un objet peut être représenté comme une séquence d'octets qui comprend les données de l'objet ainsi que des informations sur le type de l'objet et les types de données stockées dans l'objet.
Une fois qu'un objet sérialisé a été écrit dans un fichier, il peut être lu à partir du fichier et désérialisé, les informations de type et les octets qui représentent l'objet et ses données peuvent être utilisées pour recréer l'objet en mémoire.
Le plus impressionnant est que tout le processus est JVM indépendant, ce qui signifie qu'un objet peut être sérialisé sur une plateforme et désérialisé sur une plateforme entièrement différente.
Les classes ObjectInputStream et ObjectOutputStream sont des flux de haut niveau qui contiennent les méthodes de sérialisation et de désérialisation d' un objet.
La classe ObjectOutputStream contient de nombreuses méthodes d'écriture pour écrire différents types de données, mais une méthode en particulier se distingue:
public final void writeObject(Object x) throws IOException
La méthode ci-dessus sérialise un objet et l'envoie au flux de sortie. De même, la classe ObjectInputStream contient la méthode suivante pour désérialiser un objet:
public final Object readObject() throws IOException, ClassNotFoundException
Cette méthode récupère l'objet suivant hors du flux et le désérialise. La valeur de retour est de type Object, donc vous devrez le casté à son type de données approprié.
Pour démontrer comment la sérialisation fonctionne en Java, je vais utiliser la classe Employee que nous avons discuté au début du cours. Supposons que nous avons la classe Employee suivante, qui implémente l'interface Serializable :
public class Employee implements java.io.Serializable
{
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck()
{
System.out.println("Mailing a check to " + name + " " + address);
}
}
Notez que pour qu'une classe soit sérialisée avec succès, deux conditions doivent être remplies:
Si vous êtes curieux de savoir si une classe standard Java est sérialisable ou non, vérifiez la documentation pour la classe. Le test est simple: si la classe implémente java.io.Serializable, il est sérialisable ; Sinon, ce n'est pas le cas.
La classe ObjectOutputStream est utilisée pour sérialiser un objet. Le programme SerializeDemo suivant crée une instance pour un objet Employee et le sérialise dans un fichier.
Lorsque le programme est terminé, un fichier nommé employee.ser est créé. Le programme ne génère pas de sortie, mais étudiez le code et essayez de déterminer ce que le programme fait.
Remarque: Lors de la sérialisation d'un objet dans un fichier, la convention standard en Java est de donner au fichier l’ extension .ser
import java.io.*;
public class SerializeDemo
{
public static void main(String [] args)
{
Employee e = new Employee();
e.name = "Reyan Ali";
e.address = "Phokka Kuan, Ambehta Peer";
e.SSN = 11122333;
e.number = 101;
try
{
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /tmp/employee.ser");
}catch(IOException i)
{
i.printStackTrace();
}
}
}
Le programme DeserializeDemo suivant désertifie l'objet Employee créé dans le programme SerializeDemo. Étudiez le programme et essayez de déterminer sa sortie:
import java.io.*;
public class DeserializeDemo
{
public static void main(String[] args)
{
Employee e = null;
try
{
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Employee...");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
}
}
Cela produirait le résultat suivant:
Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101
Voici quelques points importants à noter: