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;}
}