*그 제안을 풀기 위해서는 class Member 클래스를 선언할때 implements serializable
* 직렬화란?
- JVM 힙 영역에 존재하는 객체를 한 줄로 늘어선 바이트의 형태로 만드는 것을 객체의 직렬화라고 하고, 객체의 형태로 복원하는 작업을 역직렬화라고 한다.
/*
*java.io.Serializabe 인터페이스를 보면 구현해야 하는 메소드가 없다. 그 이유는 Serializable 인터페이스를 구현
*한 구현체가 직렬화 대상이다라는 것을 JVM에게 알려주는 역할만을 하기 때문이다.
*
*다음은 Serializable, Externalizable 인터페이스를 이용한 샘플 코드이다.
*Serializable 인터페이스를 이용하여 객체 직렬화 시 static, transient로 선언되어 있는 필드는 제외되는 반면에 *Externalizable 인터페이스를 이용하여 객체 직렬화 시에는 writeExternal, readExternal 메소드를 구현하여
*직렬화 대상의 필드를 직접 지정한다. 만약 name,age 순으로 직렬화 하여 write 한다면 read 시에도 *name,age 순으로 역직렬화를 해와야 한다는 것을 알아야 한다. 순서를 지키지 않는 다면 java.io.EOFException *예외가 발생한다.
*
*마지막으로 객체 직렬화 시 serialVersionUID가 Serializable 인터페이스를 구현한 클래스에 선언되어 있어야
*한다. 명시적으로 선언하지 않았다면 JVM에서 자동 생성해 준다.
*/
* serialVersionUID가 필요한 이유는 무엇일까?
-직렬화 과정에서 serialVersionUID의 버전이 포함되게 되고, 역직렬화 과정에서 java class에 선언되어 있는 serialVersionUID의 버전과 서로 동일한지 체크를 하게 된다.
* serialVersionUID 버전 체크를 하는 이유는?
-버전이 바뀌게 되면 객체의 상태가 바뀌었다는 것과 같은 의미이고, 결국 역직렬화 과정에서 오류가 발생하기 때문이다.
버전이 맞지 않으면 다음과 같은 예외 발생
java.io.InvalidClassException: serializable.AdminUser; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 3

그림 A와B는 Members.data로 서로 연결이다.
그림A를 확대했다.

그림 A와B는 Members.data로 서로 연결이다.
그림A를 확대했다.
* 시리얼라이즈(Serializable)
자바 프로그래밍에서는 오브젝트의 정보를 비트열로 만들어 파일 등에 기록하고,
다시 읽어 들여 원래의 오브젝트를 만들 수 있다.
이 때, 오브젝트를 비트열화하여 출력스트림으로 기록하는 것을 시리얼라이즈,
입력 스트림으로 읽어 들여 원래의 오브젝트로 만드는 것을 디시리얼라이즈라고 한다.
다시 읽어 들여 원래의 오브젝트를 만들 수 있다.
이 때, 오브젝트를 비트열화하여 출력스트림으로 기록하는 것을 시리얼라이즈,
입력 스트림으로 읽어 들여 원래의 오브젝트로 만드는 것을 디시리얼라이즈라고 한다.
시리얼라이즈를 하기 위해서는 클래스에서 Serializable 인터페이스를 구현할 필요가 있다.
이 인터페이스에는 메서드가 없기 때문에, 오버라이딩할 필요는 없다.
이 인터페이스에는 메서드가 없기 때문에, 오버라이딩할 필요는 없다.
import java.io.*;
class A implements Serializable {
}
}
위에서 기술한 것처럼 하면 A 클래스의 오브젝트, 또는 A 클래스의 서브 클래스의 오브젝트를 시리얼라이즈할 수 있다.
비트열화한 오브젝트의 입출력을 수행하기 위해서는 ObjectInputStream 클래스와 ObjectOuputStream 클래스를 사용한다.
이것들은 바이트 스트림을 사용하는 클래스이다.
시리얼라이즈를 익혀두면, 프로그램을 종료해도 오브젝트의 정보를 보존하고 있다가
필요할때 원래대로 복원할 수 있다.
필요할때 원래대로 복원할 수 있다.


댓글 없음:
댓글 쓰기