2013-06-14 3 views
5

Java 직렬화에 대해 읽었으며 Serializable 인터페이스가 구현되면 클래스가 직렬화됩니다.자바 직렬화가 내부적으로 어떻게 작동합니까?

하지만 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 메소드를 어떻게 호출할까요?

그리고 코드를 통해 수동으로 호출해야한다면 컴파일러가 Serializable 인터페이스가 구현된다는 것을 알리는 이유는 무엇입니까?

+8

this guide about serialization이 읽을 존 소총 자바 직렬화에 대한 좋은 대답 HTTP : //stackoverflow.com/a/352133/2069368 질문에 대한 답변 일 수 있습니다. http://javabeanz.wordpress.com/2010/03/20/todays-read-how-java-serialization-w orks /. – pepuch

답변

-1

예. Serializable 인터페이스에는 구현할 방법이 없습니다. 객체를 serialize하려면 객체가 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(); 
     } 
    } 
} 

은 또한 다음

+5

위의 대답은 질문과 일치하지 않는다고 생각합니다. 질문은 ** JVM이 직렬화 또는 역 직렬화를 수행해야하는 방법을 어떻게 알 수 있습니까? ** ... 그리고 나서 ** JVM이 serialize/deSerialize 메소드를 호출하는 방법은 무엇입니까? ** –

관련 문제