Java/자바 기본 문법

[자바]I/O 스트림 기반의 인스턴스 저장

가자미 2021. 2. 28. 21:55

인스턴스를 바이트로 쪼개서 I/O스트림으로 보내게 해주는 오브젝트 스트림

ObjectInputStream	//인스턴스를 입력하는 스트림 : 인스턴스 직렬화
ObjectInputStream oi = new ObjectInputStream(new FileInputStream("object.bin")

ObjectOutputStream	//인스턴스를 출력하는 스트림 : 인스턴스 역직렬화
ObjectOUtputStream oo = new ObjectOutputStream(new FileOutputStream("object.bin")

사용방법이나 역할이 필터 스트림과 비슷.

 

ObjectOutputStream 예제

public class SBox implements java.io.Serializable{	
	//인스턴스 직렬화를 위한 기본조건인 serializeable인터페이스. 따로 구현해야할 추상메소드는 없다. 
	//이 인터페이스는 해당 클래스의 인스턴스를 저장할 필요가 있다는 선언
	String s;
	public SBox(String s) {this.s=s;}
	public String get() {return s;}
}

public static void main(String[] args) {
	SBox box1 = new SBox("Robot");
	SBox box2 = new SBox("Strawberry");
	
	try(ObjectOutputStream oo=)new ObjectOutputStream(new FileOutputStream("Object.bin"))){
		oo.writeObject(box1);	//box1이 참조하는 인스턴스 저장
		oo.writeObject(box2);	//bix2이 참조하는 인스턴스 저장
	}
	catch(IOException e) {
		e.printStackTrace();
	}
}

ObjectInputStream 예

public static void main(String[] args) {
	try(ObjectInputStream oi =
			new ObjectInputStream(new FileInputStream("Object.bin"))){
		SBox box1 = (SBox) oi.readObject();	//인스턴스 복원
		System.out.println(box1.get());
	}
	catch(ClassNotFoundException e) {
		e.printStackTrace();
	}
	catch(IOException e) {
		e.printStackTrace();
	}
}

#만약 어떤 인스턴스를 저장하려고 할 때 해당 내용물이 serializable를 구현하는 클래스의 인스턴스가 포함되면 함께 저장된다. (그렇지 않은 경우는 null로 초기화 되어 저장된다.)

public class SBox implements java.io.Serializable{
	String s;	//s가 참조하는 인스턴스까지 함께 저장
    public SBox(String s) {this.s=s;}
    public String get() {return s;}
}

transient를 붙여주면 대상을 저장하지 않겠다는 의미다.

public class SBox implements java.io.Serializable{
	transient String s;
    public SBox(string s){this.s = s;}
    public String get() {return s;}
}