프로그래밍 정리/자바

ObjectOutputStream와 ObjectInputStream : transient(객체직렬화)

주누다 2013. 6. 7. 04:29
반응형

- 스트림을 이용해서 직렬화 하는데 있어서, 커다른 프로그램 전체가 직렬화된다면, 여러가지 면에서 많은 낭비.

예를 들어, 한 객체가 마우스가 눌려진 위치를 알기 위해서 마우스 클릭시에서 위치를 저장하는 필드를 가지고 있다고 가정.

이 경우 마우스의 위치값은 프로그램이 돌아가는 상태에서 마우스가 눌려졌을 당시에만 유효한 값으로, 객체가 직렬화 되었다가

해제 되었을 경우에는 쓸모없는 값이 되어버림.

이런 객체 직렬화에 쓸모없는 값들은 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