본문 바로가기
Programming/java 고급과정

java 고급과정 8일차

by 막이 2012. 3. 14.

"객체의 직렬화"
(Serialization)
자바에서는 모든 입출력 데이터를 스트림 형태로 주고받는다.
따라서, 파일을 저장하거나 네트워크로 데이터를 전송하기 위해서
객체를 스트림으로 만드는 작업이 필요하다.




1. 직렬화 - 역직렬화
객체를 스트림으로 만드는 작업을 직렬화,
스트림을 객체로 만드는 작업을 역직렬화라고 한다.


2. 메모리상
우리가 객체를 생성하면 메모리에 할당되는데,
이 객체는 임시적인 메모리이므로 프로그램 종료와 동시에 사라지게된다.
하지만, 직렬화를 이용한다면 문제가 해결된다.
객체를 직렬화하면 메모리에 할당된 객체가
Stream형태로 변하여 보조기억장치에 저장할 수 있다.

즉, 직렬화된 객체는 스트림 형태로
입/출력에 관한한 자유롭게 이용할 수 있다.


3. 소스상
객체 직렬화를 위해서는 객체의 대상 클래스에 반드시
java.io.Serializable 을 implements 해야한다.
(ObjectOutputStream/ObjectInputStream - process Stream)

※ 참고
1) Serializable interface 는 추상메서드가 없어서 메서드를 오버라이딩할 필요도 없다.
단지, 이 인터페이스를 implements 하는 것으로 객체 직렬화가
될 수 있는 클래스로서의 자격을 부여받는다.
(이런 형태를 marker interface 라고 한다.)

2) java keyword인 'transient'를 이용하면 객체 직렬화 대상에서 제외된다.
특별히 보호하고 싶은 변수 앞에 사용하면 유용하다.
ex ) private transient String password;

Person 클래스

import java.io.Serializable;
// 직렬화 되기 위해서는 반드시 Serializable을 implements 해야 한다.
public class Person implements Serializable {
private String name;
private transient int age; // 직렬화 대상에서 제외
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}

TestObjectInput 클래스 - 스트림형태로 파일에 저장된 객체를 다시 메모리상으로 호출하는 예제


import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.ObjectInputStream;


public class TestObjectInput {


/**

* FileInputStream -> ObjectInputStream -> readObject();

* 이름 나이를 출력

*/

public static void main(String[] args) {

FileInputStream fis;

try {

fis = new FileInputStream("D://p.obj");

ObjectInputStream ois = new ObjectInputStream(fis);

Person p = (Person)ois.readObject();

System.out.println(p); // 객체를 Stream화할때 쓴쪽(output)과 읽는쪽(input)의 클래스(Person)이 최신화되어 있어야한다.

// 멤버 변수, 메서드 모두... 아니면?? InvalidClassException 발생

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}

TestObjectOutput - 직렬화된 객체의 스트림을 파일의 형태로 기록하는 예제


import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;


public class TestObjectOutput {

/**

* FileOutputStream - ObjectOutputStream // node - process

* @param args

*/

public static void main(String[] args) {

try {

FileOutputStream fos = new FileOutputStream("D://p.obj");

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(new Person("아이유", 19));

System.out.println("object serial...");

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}


 


'Programming > java 고급과정' 카테고리의 다른 글

Dynamic Web Project의 .java, .class 경로  (0) 2012.04.12
<jsp:useBean> 액션태그  (0) 2012.04.11
java 고급과정 7일차  (0) 2012.03.13
java 고급과정 6일차  (0) 2012.03.12
java 고급과정 5일차  (0) 2012.03.09