2013-06-14 17 views
5

私はJavaのシリアル化について読んでいて、Serializableインターフェイスが実装されていればクラスがシリアル化されていることを知りました。Javaシリアル化は内部的にどのように動作しますか?

ただし、Serializableはマーカーインターフェイスです。次に、JVMは、どのメソッドを使ってシリアライゼーションまたはデシリアライゼーションを行うべきかを知っていますか?

私の理解しているように、インタフェースで宣言されたメソッドは多態性によって呼び出されます。

私は以下の例を私の質問を例証する。

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


} 

これで、JVMがserialize/deSerializeメソッドをどのように呼び出すのですか?

私はそれらを手動でコードを介して呼び出す必要がある場合、なぜコンパイラは、シリアル化可能なインターフェイスが実装されていることを知らされるべきですか?

+8

を読んでJavaのシリアライズについてのジョンスキートの偉大な答えは、http ://stackoverflow.com/a/352133/2069368これはあなたの質問に対する答えかもしれません。http://javabeanz.wordpress.com/2010/03/20/todays-read-how-java-serialization-w orks /。 – pepuch

答えて

-1

はい、Serializableインターフェイスには実装する方法がありません。オブジェクトを直列化したい場合、オブジェクトはSerializableインタフェースを実装する必要があります。次に、ObjectOutputStreamオブジェクトやObjectInputStreamオブジェクトを使用して、オブジェクトのシリアル化/逆シリアル化プロシージャを実行できます。

例はほとんどありません。

シリアライズする必要があるクラス、/デシリアライズ:シリアライズ/デシリアライズする方法と

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

クラス:

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

もここthis guide about serialization

+5

私は上記の答えは質問と一致しないと思う。問題は** JVMがどのメソッドをシリアライゼーションまたはデシリアライゼーションを行うべきか知っていますか?** ...そして** JVMがメソッドをシリアライズ/デシリアライズする方法** –

関連する問題