본문 바로가기

Java

[Stream] ObjectInputStream, ObjectOutputStream.

객체를 주고 받기 위함. 당연히 객체는
Serializable를 implements 하고 있어야 한다.

어? 어디서 많이 보던건데? 하고 생각하셨다면 바로 보통 여러 서적에 나와있는 RMI이다.

객체를 주고받기 위해 직렬화 시키고 직렬화를 위해서 Serializable을 implements 하는 것..

결국 다시 얘기하면 직렬화는 스트림을 통해 객체를 주고 받기 위한 작업인 것이다.

(라고 김풍주대리님께서 가르쳐주셨다. ㅎㅎㅎ)

결국 위의 스트림을 이용하면, RMI와 비슷한 역할을 하는 녀석도 만들어 낼 수 있다.

(실제로 풍대리님께서 만들어보이셨음..-_-b 그것은 나중에 다시...)

우선 소스를 보면

전달 대상이 되는 객체는

public class ObjectStreamSampleData implements Serializable {
 public String str;
 public int id;
 public ObjectStreamSampleData(String str, int id) {
  this.str = str;
  this.id = id;
 }
 public String getObjectStreamSampleData(){
  return id + "=" + str;
 }

}

출처 : jabook.org

그리고 일을 하는 클래스는

public class ObjectStreamHandle {
 public static void main(String[] args) throws Exception {
  FileOutputStream fos = new FileOutputStream("d:/serial.dat");
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  ObjectStreamSampleData s1 = new ObjectStreamSampleData("홍길동", 1004);
  ObjectStreamSampleData s2 = new ObjectStreamSampleData("김삿갓", 1005);
  oos.writeObject(s1);
  oos.writeObject(s2);
  oos.close();
  System.out.println(s1 + ":" + s1.getObjectStreamSampleData());
  System.out.println(s2 + ":" + s2.getObjectStreamSampleData());

  FileInputStream fis = new FileInputStream("d:/serial.dat");
  ObjectInputStream ois = new ObjectInputStream(fis);
  ObjectStreamSampleData sd1 = (ObjectStreamSampleData)ois.readObject();
  ObjectStreamSampleData sd2 = (ObjectStreamSampleData)ois.readObject();
  ois.close();
  System.out.println(sd1 + ":" + sd1.getObjectStreamSampleData());
  System.out.println(sd2 + ":" + sd2.getObjectStreamSampleData());

 }
}
출처 : jabook.org

이다.

객체를 만들어서 이것을 ObjectOutputStream을 통해 파일로 쓰고
이 파일로 부터 읽어 들여온다.

파일을 열어보면 이전 포스트인 수동직렬화 같이 문자열로 정보가 있는 것은 아니고
바이너리 처럼 들어가 있게 된다.

여기서는 파일을 이용했지만..
파일을 사용하지 않고 주고 받을 수 있게 작업 한다면
원격 호출로써의 역할을 할 수 있을 것이다.