본문 바로가기

# 02/Java

[윤성우 열혈자바] 32-4. I/O 스트림 기반의 인스턴스 저장

반응형

ObjectInputStream & ObjectOutputStream


• ObjectInputStream  인스턴스를 입력하는 스트림 : 인스턴스 직렬화

  ObjectInputStream oi = new ObjectInputStream(new FileInputStream("Object.bin"))

  public final Object readObject() throws IOException, ClassNotFoundException

 

• ObjectOutputStream  인스턴스를 출력하는 스트림 : 인스턴스 역직렬화 

  ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("Object.bin"))

             public final void writeObject(Object obj) throws IOException








ObjectOutputStream 예제


public class SBox implements java.io.Serializable {

   String s;

   public SBox(String s) { this.s = s; }

   public String get() { return s; }

}

인스턴스 직렬화를 위한 기본 조건인

Serializable 인터페이스의 구현


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); // obx2 참조하는 인스턴스 저장

   }

   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());

      SBox box2 = (SBox) oi.readObject(); // 인스턴스 복원

      System.out.println(box2.get());

   }

   catch(ClassNotFoundException e) {

      e.printStackTrace();

   }

   catch(IOException e) {

      e.printStackTrace();

   }

}









줄줄이 사탕으로 엮여 들어갑니다. 그리고 transient


public class SBox implements java.io.Serializable {

    String s;   // s 참조하는 인스턴스까지 함께 저장

    public SBox(String s) { this.s = s; }

    public String get() { return s; }

}


참조변수 s 참조하는 인스턴스가 Serializable 구현하는 클래스의 인스턴스이면 함께 직렬화! 

String은 Serializable을 구현하기 때문에 인스턴스 저장시 같이 저장됨!

String 인스턴스는 저장하고 싶지 않고 null로 초기화 하고 싶으면 transient 사용해주면 됨!


public class SBox implements java.io.Serializable {

    transient String s;    //  참조변수가 참조하는 대상은 저장하지 않겠다는 선언

    public SBox(String s) { this.s = s; }

    public String get() { return s; }

}



반응형