객체를 전송( 또는 파일로 저장)하기위해서는
마샬링 à 데이터전송 à 언마샬링
의 단계를 거치게된다. 마샬링 될 수 있는 데이터는 기본자료형(Boolean, byte, char, short, int……)과 java.io.Serializable 인터페이스(Mark Interface)를 구현한 객체만 가능하다.
객체는 내부적으로 다른 객체를 참조할 수 있기때문에 많이 복잡한 과정을 거치게된다. 객체를 직렬화 할 수 있다는 것은 객체에 있는 필드 값과 필드가 참조하는 객체들이 마샬링된다는 것을 의미한다. 이 부분을 잘못 이해해서 객체에 있는 메소드의 코드도 모두 마샬링된다고 생각하면 안된다. 이런 것은 과부하가 걸릴 수 있기때문에 객체의 내용(필드)만 직렬화 되어진다. 그렇기 때문에 읽어 들이는 쪽에서는 언마샬링 하기위해서는 전달한 객체의 클래스가 있어야만, 그리고 전달 받은 객체에 대한 클래스가 있어야만 원래 현태로 온전하게 복원할 수 있다.
다음코드는 Book객체에 대한 직렬화 예제코드 이다.
BookObjectOutputTest클래스에서 Book객체를 직렬화하여 파일로 저장하고BookObjectInputTest클래스에서 저장된 객체파일을 읽어서 복원한다.
Book.java
package ch6;
import java.io.Serializable;
public class Book implements Serializable { private String isbn; private String title; transient private String author; private int price;
public Book(String isbn, String title, String author, int price) { this.isbn = isbn; this.title = title; this.author = author; this.price = price; }
public String getAuthor() { return author; }
public String getIsbn() { return isbn; }
public int getPrice() { return price; }
public String getTitle() { return title; }
public void setAuthor(String author) { this.author = author; }
public void setIsbn(String isbn) { this.isbn = isbn; }
public void setPrice(int price) { this.price = price; }
public void setTitle(String title) { this.title = title; }
public String toString() { return getIsbn() + "," + getTitle() + "," + getAuthor() + "," + getPrice(); }
// private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { // s.defaultReadObject(); // // Something TODO // }
}
|
객체의 Deserialization한 후에도 부족한 객체 복원이 있을수 있다. DB Connection이라든가, 이벤트 등록의 예가 되겠다. 이런 작업은 직렬화를 통해서 다를수 있는 부분이 아니기 때문에 객체에 readObject()라고 명명되어진 메소드를 구현하게 되면 이 메소드에 입력인자로 설정된 ObjectInputStream의 defaultReadObject()에게Deserialization작업이 위임되고 개발자는 그 다음 코드에 추가 초기화 등과 같은 기타 필요한 코드를 추가해주면 된다.
*** ObjectInputStream의 readObject()메소드와 이름은 같아서 혼돈될 수 있는데 다른 메소드이다.
BookObjectOutputTest.java
package ch6;
import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.ArrayList;
public class BookObjectOutputTest {
public static void main(String[] args) { FileOutputStream fout = null; ObjectOutputStream oos = null;
ArrayList list = new ArrayList(); Book b1 = new Book("a0001", "자바완성", "홍길동", 10000); Book b2 = new Book("a0002", "스트럿츠", "김유신", 20000); Book b3 = new Book("a0003", "기초 EJB", "김성박", 25000); list.add(b1); list.add(b2); list.add(b3);
try { fout = new FileOutputStream("booklist.dat"); oos = new ObjectOutputStream(fout);
oos.writeObject(list);
System.out.println("저장되었습니다.");
} catch (Exception ex) { } finally { try { oos.close(); fout.close(); } catch (IOException ioe) { } } // finally } // main end } // class end
|
BookObjectInputTest.java
package ch6;
import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.ArrayList;
public class BookObjectInputTest {
public static void main(String[] args) { FileInputStream fin = null; ObjectInputStream ois = null;
try { fin = new FileInputStream("booklist.dat"); ois = new ObjectInputStream(fin);
ArrayList list = (ArrayList) ois.readObject(); Book b1 = (Book) list.get(0); Book b2 = (Book) list.get(1); Book b3 = (Book) list.get(2);
System.out.println(b1.toString()); System.out.println(b2.toString()); System.out.println(b3.toString());
} catch (Exception ex) { } finally { try { ois.close(); fin.close(); } catch (IOException ioe) { } } // finally } // main end } // class end
|
'Java > Input/Output Facilities' 카테고리의 다른 글
[바이트 스트림] 데이터 압축 및 해제 - GZIPOutputStream & GZIPInputStream 사용 (0) | 2013.02.11 |
---|---|
객체의 직렬화 & serialVersionUID (0) | 2013.02.11 |
[문자 스트림] 배열형태로 만든후 내용을 화면으로 출력- CharArrayReader와CharArrayWriter의 사용 (0) | 2013.02.11 |
[문자 스트림] 키보드로부터 한줄씩읽어 파일저장 - BufferedReader와PrinterWriter의 사용 (1) | 2013.02.11 |
[문자 스트림] BufferedReader와BufferedWriter를 이용한 파일복사 (0) | 2013.02.11 |