2013-06-14 2 views
5

Java serileştirme hakkında bir şeyler okuyordum ve Serializable arabirimi uygulandığında sınıfın serileştirildiğini öğrendim.Java seri hale getirme dahili olarak nasıl çalışır?

Ancak Serializable bir işaretçi arabirimidir. Öyleyse JVM, hangi serileştirme ya da serileştirme işlemlerinin yapılması gerektiğini biliyor? Benim anlayışım gereği, bir arayüzde bildirilen yöntemler polimorfizm yoluyla çağrılmaktadır.

Sorumu açıklamak için aşağıda bir örnek verebilirim.

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. 
    } 


} 

Şimdi JVM, serialize/deSerialize yöntemlerini nasıl arayacak?

Ve bunları manuel olarak kod yoluyla çağırmam gerekirse, derleyici neden Serializable arabiriminin uygulandığını bilmeli?

+8

this guide about serialization okumak Jon Skeet java seri hale getirme hakkında büyük bir cevap http : //stackoverflow.com/a/352133/2069368 ve bu sizin sorunuzun cevabı olabilir http://javabeanz.wordpress.com/2010/03/20/todays-read-how-java-serialization-w orks /. – pepuch

cevap

-1

Evet, Seri hale getirilebilir arabirimin uygulayacağı herhangi bir yöntemi yoktur. Nesneyi seri hale getirmek istiyorsanız, nesneniz Seri hale getirilebilir arabirimi uygulamalıdır. Daha sonra, örneğin ObjectOutputStream ve ObjectInputStream nesnelerini kullanarak, nesnenizle seri hale getirme/seri hale getirme yordamları gerçekleştirebilirsiniz.

Çok az örnek var. serialize gerekiyor

Sınıf/serisi kaldırılmaya: seri/seri kaldırma yöntemleri ile

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

Sınıf:

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

Ayrıca burada

+5

Yukarıdaki cevabın soruyla uyuşmadığını düşünüyorum. Soru şu: JVM, serileştirme ya da serileştirme işleminin hangi yöntemlerle yapılması gerektiğini nasıl biliyor? ** Ve sonra ** JVM, serialize/deSerialize yöntemlerini nasıl arayacak? ** –