인스턴스 정보를 전송하기 위해 직렬화를 시킨다. 이후 전송받아 내용을 복원하는 것을 역직렬화라고 한다. 즉, 직렬화란 인스턴스 참조변수를 스트림을 통해 전송하기 위해 하는 일이다.
이 때 사용하는 클래스가 ObjectInputStream과 ObjectOutputStream이다.
ObjectInputStream(InputStream in)
ObjectOutputStream(OutputStream out)
ObjectInputStream은 InputStream 객체를 생성자의 매개변수로 받는다. ObjectOutputStream은 OutputStream 객체를 생성자의 매개변수로 받는다.
1. 직렬화 / 역직렬화
Person 클래스를 정의하고 인스턴스를 만들어 직렬화를 시킨다음 스트림으로 출력하여 파일에 저장하고 다시 읽어보자.
package stream;
import java.io.Serializable;
public class Person implements Serializable { //직렬화를 해야하므로 Serializable 인터페이스 구현
String name;
int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name+","+age;
}
}
package stream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializationTest {
public static void main(String[] args) throws ClassNotFoundException { //역직렬화 과정에서 Class 찾지 못할 수 있으므로 ClassNotFoundException 던지기
Person per1 = new Person("John", 23);
Person per2 = new Person("Kelly", 39);
try(FileOutputStream fos = new FileOutputStream("serial.out")){
ObjectOutputStream oos = new ObjectOutputStream(fos); //생성자 매개변수로 FileOutputStream 객체 전달
oos.writeObject(per1); //ObjectOutputStream을 통해 "serial.out" 파일에 쓰기
oos.writeObject(per2);
}catch(IOException e) {
System.out.println(e);
}
try(FileInputStream fis = new FileInputStream("serial.out")){
ObjectInputStream ois = new ObjectInputStream(fis); //생성자 매개변수로 FileInputStream 객체 전달
Person p1 = (Person)ois.readObject(); //반환형이 Object형이므로 Person으로 강제 형변환
Person p2 = (Person)ois.readObject();
System.out.println(p1);
System.out.println(p2);
}catch(IOException e) {
System.out.println(e);
}
}
}
실행결과
John,23
Kelly,39
"serial.out" 파일을 열어보면 우리가 알 수 없는 형태로 객체가 저장되어 있는 것을 볼 수 있다. 우리가 다시 이것을 문자 형태로 읽으려면 역질렬화를 해야하는데, 이것을 ObjectInputStream 클래스를 통해 할 수 있다.
2. 직렬화 제외
직렬화 과정에서는 모든 인스턴스 변수가 직렬화된다. 직렬화에서 제외하고 싶은 변수는 앞에 transient 예약어를 붙이면 된다. 이 예약어가 붙은 변수는 저장될 때 그 자료형의 기본값으로 저장된다. 가령 int형 멤버변수는 0, String 참조변수 값은 null로 저장되는 것이다.
위에서 사용한 코드에서 String name을 transient String name으로 변경하고 다시 실행시켜보자.
transient String name;
int age;
실행결과
null,23
null,39
이름이 자동으로 null로 저장된다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
(Java) 56 - 보조 스트림 (0) | 2020.05.18 |
---|---|
(Java) 55 - Reader와 Writer (0) | 2020.05.18 |
(Java) 54 - File 입출력 (0) | 2020.05.18 |
(Java) 53 - Scanner 클래스 (0) | 2020.05.18 |
(Java) 52 - Java 입출력 (0) | 2020.05.18 |