- 자바 객채를 저장하거나 전송하기 위해서 자바 객체의 코드를 다시 복원가능한 형태의 Stream 으로 변경(?) 직렬화 시켜주는 것
- 용어 설명
* 직렬화 : Heap 에 위치한 객체를 출력 가능한 상태로 만드는 작업
* 역직렬화 : 직렬화된 객체를 다시 Heap 에 넣기 위한 작업
* 직렬화의 대상은 객체의 Attribute 의 값 (메소드는 그저 주소값만 필요) - Attribute 만 직렬화된단 말씀
* 객체를 IO 하기 위해서는 필터 스트림인 ObjectInputStream & ObjectOutputStream 이 필요하다
* 직렬화할 대상객치는 java.io.Serializable 를 implements 한 클래스(객체) 이어야 한다.
EX) 직렬화 대상 클래스
import java.io.*
public class Member implements Serializable {
private String name;
private String address;
private String hobby;
private transient int age; // 객체 Instance 앞에 transient 키워드를 붙여주면 직렬화 대상에서 제외 된다.
}
EX) 객체 직렬화 하기
public void writeMenberObject(Member m) throws IOException {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutPutStream(new FileOutputStream("mem.obj") ); // 연결 + 필터 추가
oos.writeObject(m); // 객체를 출력하는 메소드 : writeObject(Object obj)
// write 할때 Exception 이 발생하는데 이 때 close 를 안하면 스트림이 안닫혀 있는 상태로
} fimally {
if( oos != null ) {
oos.close(); // close 해줌
}
}
}
EX) 역직렬화 된 객체를 복원하기
public Member readMemberObject() throws IOException, ClassNotFoundException {
ObjectInputStream ois = null;
Member m = null;
try {
ois = new ObjectInputStream(new FileInputStream("mem.obj") );
m = (Member)ois.readObject();
}finally {
ois.close();
return m;
}
}
- 직렬화 대상 클래스 EX) 중에 인스턴스 변수명 앞에 "transient" -> 객체 직렬화 피하기!
* 보안적인 측면에서 직렬화 할때 빼는 경우
* 직렬화 대상이 아닌 객체의 Type
- 예제를 보기전에 설명을 하자면 직렬화할 클래스에 implements Serializable 를 붙였다.
Ex) Class Woochul implements Serialzable
'Ex)' 의 'Woochul' class 에 다른 객체(Serialzable 안한 class)의 멤버 인스턴스를 가지고 있다면, 직렬화가 되지 않는다.
이때도, transient 를 사용해서 제외시킨다.(코드를 수정하지 않아도 되는 이점이 있다고 한다.)
EX) 객체 직렬화 피하기
Class Woochul implements Serialzable{
Ssung ssung = new Ssung(); -> transient Ssung ssung = new Ssung(); // 객체 직렬화 피하기
}
Class Ssung {
....
}
- 부록
역직렬화해서 만든 객체(readObject() 메소드로 불러온 객체)의 클래스가 변경 되었을떄
JVM 은 역직렬화 객체를 대입할수 없다고 예외를 발생 시킨다.
직렬화, 역직렬화 할때 JVM 이 serialVersionUID 를 부여하는데 역직렬화해서 만든 객체의 클래스가 변경될때 이 값
(serivalVersionUID) 변경이 되어 서로 일치하지 않아서 발생하는 현상이다.
이를 해결하기 위해서 새로변경된 클래스와 역직렬화 하는 객체의 serialVersionUID 를 일치시켜주어야 한다.
참고사이트 -> ##### http://dojeun.egloos.com/317825 #######
'공부 > JAVA' 카테고리의 다른 글
JAVA_[Vector] (0) | 2012.07.31 |
---|---|
JAVA_[Thread] (0) | 2012.06.23 |
JAVA_[Adapter_패턴 (일명 : Wrapper 패턴)] (0) | 2012.06.23 |
JAVA_[Eclipse_SerialVersionUID] (0) | 2012.06.23 |
JAVA_[코딩_지침] (0) | 2012.06.21 |