객체를 전송( 또는 파일로 저장)하기위해서는

마샬링 à 데이터전송 à 언마샬링

의 단계를 거치게된다. 마샬링 될 수 있는 데이터는 기본자료형(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작업이 위임되고 개발자는 그 다음 코드에 추가 초기화 등과 같은 기타 필요한 코드를 추가해주면 된다.

*** ObjectInputStreamreadObject()메소드와 이름은 같아서 혼돈될 수 있는데 다른 메소드이다.

 

 

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

 

 

Posted by Steven J.S Min
,