Latest web development tutorials

serializzazione Java

Java fornisce un meccanismo oggetto-serializzazione, che, un oggetto può essere rappresentato come una sequenza di byte, la sequenza di byte comprende il tipo di dati dell'oggetto, informazioni sul l'oggetto e il tipo di dati memorizzati nell'oggetto .

Dopo che il file viene scritto un oggetto serializzato possono essere letti dal file, e si deserializzato, vale a dire, il tipo di informazioni sugli oggetti, oggetti di dati e tipi di dati oggetto può essere utilizzato in memoria i nuovi oggetti.

L'intero processo è una Java Virtual Machine (JVM) indipendenti, vale a dire, su un oggetto piattaforma serializzato può deserializzare l'oggetto su una piattaforma completamente diversa.

flussi ObjectInputStream e ObjectOutputStream classe di alto livello di dati, la serializzazione e metodi che contengono gli oggetti anti-sequenza.

Classe ObjectOutputStream contiene molti metodo di scrittura per scrivere una varietà di tipi di dati, ma uno speciale eccezioni modo:

public final void writeObject(Object x) throws IOException

Il metodo di cui sopra serializzare un oggetto e inviarlo al flusso di output. Simile classe ObjectInputStream contiene la seguente deserializzare metodo di un oggetto:

public final Object readObject() throws IOException, 
                                 ClassNotFoundException

Questo metodo richiede l'oggetto successivo dal flusso, e l'oggetto viene deserializzato. Il suo valore di ritorno è oggetto, quindi è necessario convertirlo nel tipo di dati appropriato.

Per dimostrare la serializzazione Java è come funziona, userò il tutorial classe Employee accennato prima, se definiamo la seguente classe Employee, che implementa l'interfaccia 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);
   }
}

Si noti che una serializzazione oggetto di classe al fine di avere successo, due condizioni devono essere soddisfatte:

La classe deve implementare oggetto java.io.Serializable.

Tutti questi attributi devono essere serializzabile. Se vi è una proprietà non è serializzabile, la proprietà deve essere indicata brevemente.

Se si vuole sapere se una classe standard di Java è serializzabile, consultare la documentazione per questa classe. Verificare se un'istanza di una classe può essere serializzato è molto semplice, basta vedere la classe non ha raggiunto l'interfaccia java.io.Serializable.


oggetto serializzato

Classe ObjectOutputStream viene utilizzata per serializzare un oggetto, SerializeDemo seguente viene creata un'istanza un oggetto Employee, e l'oggetto è serializzato in un file.

Dopo questo programma viene eseguito, si crea un file di nome employee.ser. Questo programma non ha uscita, ma è possibile leggere il codice di comprendere il ruolo di un programma.

Nota: Quando un oggetto è serializzato in un file, in conformità con la convenzione standard di Java è quello di presentare una estensione .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();
      }
   }
}

oggetti deserializzare

Il seguente esempio di programma DeserializeDemo deserializzazione, / tmp / employee.ser memorizzato oggetto 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);
    }
}

Compilare ed eseguire il programma sopra i risultati sono i seguenti:

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

Qui dobbiamo notare i seguenti punti:

il metodo readObject () in un blocco try / blocco catch tentativi di catturare un'eccezione ClassNotFoundException. Per la JVM può deserializzare oggetto, si deve essere in grado di trovare le classi bytecode. Se la JVM non riesce a trovare la classe nell'oggetto processo di deserializzazione, un'eccezione ClassNotFoundException.

Si noti che il valore di ritorno, il metodo readObject () viene convertito in riferimento dipendenti.

Quando un oggetto viene serializzato, il valore della proprietà SSN 111 222 333, ma perché la proprietà è breve, il valore non viene inviato al flusso di output. Quindi SSN attributo dell'oggetto Employee deserializzato è 0.