Java/18. IO 기반 입출력 및 네트워킹
Day 23 : 객체 입출력 보조 스트림 - 직렬화가 가능한 클래스 (Serializable)
pancakemaker
2021. 11. 18. 17:28
Serializable 인터페이스를 구현한 클래스만 직렬화할 수 있음
: private 필드를 포함한 모든 필드를 바이트로 변환 가능
: 객체를 직렬화하면 바이트로 변환되는 것은 필드들이고, 생성자 및 메소드는 직렬화에 포함되지 않음
→ 역직렬화시 필드의 값만 복원
: static 필드, transient 필드는 직렬화 불가
직렬화가 가능한 클래스
package sec05.exam08_objectinputstream_objectoutputstream_YJ;
import java.io.Serializable;
public class ClassA implements Serializable {
int field1; //직렬화에 포함
ClassB field2 = new ClassB(); //직렬화에 포함
static int field3; //직렬화에서 제외
transient int field4; //직렬화에서 제외
}
직렬화가 가능한 클래스
package sec05.exam08_objectinputstream_objectoutputstream_YJ;
import java.io.Serializable;
public class ClassB implements Serializable {
int field1; //직렬화에 포함
}
직렬화해서 파일에 저장
package sec05.exam08_objectinputstream_objectoutputstream_YJ;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializableWriter {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("C:/Temp/Object.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
ClassA classA = new ClassA();
classA.field1 = 1;
classA.field2.field1 = 2;
classA.field3 = 3;
classA.field4 = 4;
oos.writeObject(classA);
oos.flush();
oos.close();
fos.close();
}
}
역직렬화해서 복원된 필드 조사
package sec05.exam08_objectinputstream_objectoutputstream_YJ;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class SerializableReader {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("C:/Temp/Object.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
ClassA v = (ClassA) ois.readObject();
System.out.println("field1: " + v.field1);
System.out.println("field2.field1: " + v.field2.field1);
System.out.println("field3: " + v.field3);
System.out.println("field4: " + v.field4);
}
}
field1: 1
field2.field1: 2
field3: 0
field4: 0