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