2013-06-14 20 views
5

Stavo leggendo sulla serializzazione Java e sono venuto a sapere che se l'interfaccia Serializable è implementata allora la classe è serializzata.Come la serializzazione java funziona internamente?

Ma Serializable è un'interfaccia marker. Quindi, come fa JVM a sapere con quali metodi la serializzazione o la de-serializzazione dovrebbero essere eseguite?

Secondo la mia comprensione i metodi dichiarati in un'interfaccia sono chiamati via polimorfismo.

Vorrei dare un esempio qui sotto per esemplificare la mia domanda.

public class MySerializable implements Serializable{ 

    public void serialize(){ 

     //Some code to serialize to a file output stream. 
    } 

    public void deSerialize(){ 

     //Some code to de-serialize to a file input stream. 
    } 


} 

Quindi ora come JVM chiamerà i metodi serialize/deSerialize?

E se devo chiamarli manualmente tramite codice, allora perché il compilatore dovrebbe far sapere che l'interfaccia Serializable è implementata?

+8

Ecco Jon Skeet grande risposta su Java serializzazione http : //stackoverflow.com/a/352133/2069368 e questa potrebbe essere la risposta alla tua domanda http://javabeanz.wordpress.com/2010/03/20/todays-read-how-java-serialization-w Orchi /. – pepuch

risposta

-1

Sì, l'interfaccia serializzabile non ha metodi da implementare. Se vuoi serializzare l'oggetto, il tuo oggetto deve implementare un'interfaccia Serializable. Successivamente, è possibile eseguire le procedure di serializzazione/deserializzazione con il proprio oggetto, ad esempio utilizzando oggetti ObjectOutputStream e ObjectInputStream.

Ci sono pochi esempi.

Class, che hanno bisogno di serializzare/deserializzare:

import java.io.Serializable; 

public class ObjectToSerialize implements Serializable { 

    private static final long serialVersionUID = 7526472295622776147L; 

    private String firstName; 
    private String lastName; 

    public ObjectToSerialize(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    @Override 
    public String toString() { 
     return getFirstName() + " " + getLastName(); 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 
     ObjectToSerialize that = (ObjectToSerialize) o; 
     return firstName.equals(that.firstName) && lastName.equals(that.lastName); 
    } 
} 

classe con metodi di serializzazione/deserializzazione:

import java.io.*; 

public class ObjectSerialization { 

    public static void saveObject(Serializable object, String path) throws IOException { 
     try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path))) { 
      oos.writeObject(object); 
     } 
    } 

    public static Object loadObject(String path) throws ClassNotFoundException, IOException { 
     try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path))) { 
      return ois.readObject(); 
     } 
    } 

    public static void main(String[] args) { 
     ObjectToSerialize object = new ObjectToSerialize("Eldar", "Agalarov"); 
     try { 
      String path = "C:/object.bin"; 
      saveObject(object, path); 
      System.out.println("Object serialized: " + object); 

      ObjectToSerialize deserializedObject = (ObjectToSerialize) loadObject(path); 
      System.out.println("Object deserialized: " + deserializedObject); 
      System.out.println("They are equals: " + object.equals(deserializedObject)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

visualizzato anche this guide about serialization

+5

Penso che la risposta sopra non corrisponda alla domanda. La domanda è ** Come fa JVM a sapere quali metodi serializzare o de-serializzare dovrebbero essere fatti? ** ...... E poi ** come JVM chiamerà i metodi serialize/deSerialize? ** –

Problemi correlati