English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Java

Contrôle de flux Java

Java Array

Java Orienté Objet (I)

Java Orienté Objet (II)

Java Orienté Objet (III)

Gestion des exceptions Java

Java List

Java Queue (file d'attente)

Java Map Collections

Java Set Collections

Java Entrée/Sortie (I/O)

Java Reader/Writer

Autres sujets Java

Java serialization

Java fournit un mécanisme de sérialisation d'objet, dans lequel un objet peut être représenté sous forme de séquence d'octets, incluant les données de l'objet, les informations sur le type de l'objet et les types de données stockés dans l'objet.

Après avoir écrit l'objet sérialisé dans un fichier, il peut être lu à partir du fichier et désérialisé, ce qui signifie que les informations sur le type de l'objet, les données de l'objet et les types de données contenus dans l'objet peuvent être utilisés pour créer un nouvel objet en mémoire.

Le processus tout entier est indépendant du Java Virtual Machine (JVM), ce qui signifie qu'un objet sérialisé sur une plateforme peut être désérialisé sur une plateforme complètement différente.

Les classes ObjectInputStream et ObjectOutputStream sont des flux de données de haut niveau, qui contiennent des méthodes pour désérialiser et sérialiser des objets.

La classe ObjectOutputStream contient de nombreux méthodes pour écrire divers types de données, mais une méthode en particulier fait exception :

public final void writeObject(Object x) throws IOException

La méthode ci-dessus sérialise un objet et le transmet au flux de sortie. Une classe ObjectInputStream similaire contient les méthodes suivantes pour désérialiser un objet :

public final Object readObject() throws IOException, 
                                 ClassNotFoundException

该方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,你需要将它转换成合适的数据类型。

为了演示序列化在Java中是怎样工作的,我将使用之前教程中提到的Employee类,假设我们定义了如下的Employee类,该类实现了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);
   }
}

请注意,一个类的对象要想序列化成功,必须满足两个条件:

该类必须实现 java.io.Serializable 接口。

该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

如果你想知道一个 Java 标准类是否是可序列化的,请查看该类的文档。检验一个类的示例是否能序列化十分简单,只需要查看该类有没有实现 java.io.Serializable 接口。

序列化对象

ObjectOutputStream 类用来序列化一个对象,如下的 SerializeDemo 实例示例化了一个 Employee 对象,并将该对象序列化到一个文件中。

该程序执行后,就创建了一个名为 employee.ser 的文件。该程序没有任何输出,但是你可以通过代码研读来理解程序的作用。

注意: 当序列化一个对象到文件时,按照 Java 的标准约定是给文件一个 .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("Les données sérialisées sont enregistrées dans /tmp/employee.ser);
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

Désérialisation de l'objet

Le programme DeserializeDemo suivant illustre la désérialisation,/tmp/employee.ser contient l'objet Employee.

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

The compilation and running results of the above program are as follows:

Deserialized Employee...
Name: Reyan Ali
Address: Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

Here are the following points to note:

try in the readObject() method/The catch block tries to catch the ClassNotFoundException exception. For JVM to deserialize objects, the class must be able to find the bytecode. If the JVM cannot find the class during the deserialization process, it throws a ClassNotFoundException exception.

Note that the return value of the readObject() method is converted to an Employee reference.

The value of the SSN attribute when the object is serialized is 111222333However, since this property is transient, the value has not been sent to the output stream. Therefore, after deserialization, the SSN attribute of the Employee object is 0.