- 스트림을 이용해서 직렬화 하는데 있어서, 커다른 프로그램 전체가 직렬화된다면, 여러가지 면에서 많은 낭비.
예를 들어, 한 객체가 마우스가 눌려진 위치를 알기 위해서 마우스 클릭시에서 위치를 저장하는 필드를 가지고 있다고 가정.
이 경우 마우스의 위치값은 프로그램이 돌아가는 상태에서 마우스가 눌려졌을 당시에만 유효한 값으로, 객체가 직렬화 되었다가
해제 되었을 경우에는 쓸모없는 값이 되어버림.
이런 객체 직렬화에 쓸모없는 값들은 transient로 선언해 줌으로써 객체 직렬화에서 제외되어질 수 있음.
private transient int x;
이러한 선언은 플랫폼에 따라 다른 값을 가지는 필드나, 현재의 환경에서만 유효한 필드 등을 객체 직렬화해서 제외하는데
유용하게 쓰일 수 있음.
=================================================================================================================
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectSerializeTest1 extends TestClass implements Serializable{
// 변수 선언, x는 객체직렬화에서 제외되도록 transient로 선언
private int i;
private transient int x;
// 생성자 Serializable을 implement한 i와 x는 받아온인자를 그대로 대입,
// TestClass를 extends한 j는 i값에 5배를 한 값을 대입
public ObjectSerializeTest1(int i, int x){
this.i = i;
this.x = x;
j = i*5;
}
// 객체직렬화를 하기전의 객체의 값들을 알아본뒤에, 해당 객체를 스트림에 직렬화
private void writeObject(ObjectOutputStream out) throws IOException{
System.out.println("writeObject");
System.out.println("write ==> i = " + this.i + ", j=" + j + ", x=" + this.x);
out.defaultWriteObject(); // 객체를 직렬화
out.writeInt(j); // 임시파일에 기록
}
// 스트림으로부터 객체를 해제
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
System.out.println("readObject");
in.defaultReadObject(); // 객체 직렬화 해제 작업
j = in.readInt(); // 임시파일에서 읽어옴
}
// 객체의 값을 알기 위해서 오바리이드
public String toString(){
return "i = " + i + ", j=" + j + ", x=" + x;
}
public static void main(String[] args) throws Exception{
// 객체직렬화에 사용될 화일트 열고 스트림을 얻음
FileOutputStream fos = new FileOutputStream("temp.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
// 객체를 생성시킨뒤, 스트림에 객체를 씀.(10은 transient로 선언된 필드의 값임을 유의)
oos.writeObject(new ObjectSerializeTest1(1, 10));
oos.close();
// 정보를 저장한 파일을 열고 스트림을 통해 읽은뒤 객체직렬화를 해케
FileInputStream fis = new FileInputStream("temp.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
ObjectSerializeTest1 ser = (ObjectSerializeTest1)ois.readObject();
ois.close();
// print문 수행시 형 변환이 이루어져서 이미 오버라이드된 toString()메소드가 수행
System.out.println("read==>" +ser);
}
}
'프로그래밍 정리 > 자바' 카테고리의 다른 글
쓰레드의 우선권 (0) | 2013.06.17 |
---|---|
쓰레드의 상태 (0) | 2013.06.17 |
ObjectInputStream와 ObjectOutputStream (0) | 2013.06.07 |
StringReader와 StringWriter (0) | 2013.06.02 |
CharArrayReader와 CharArrayWriter (0) | 2013.06.02 |