2014년 3월 18일 화요일

서울구로디지털단지자바교육,자바 객체직렬화, Java Object Serialization, AWT직렬화예제, ObjectInput, ObjectOutput, 자바교육/자바학원/자바객체직렬화교육/자바AWT교육

서울구로디지털단지자바교육,자바 객체직렬화, Java Object Serialization, AWT직렬화예제, ObjectInput, ObjectOutput, 자바교육/자바학원/자바객체직렬화교육/자바AWT교육

- 객체는 클래스를 통해 필요 한 시기에  생성되며 프로그램이 종료하지 않더라도  소멸된다. 물론 프로그램이 종료하면 사라진다. 실행시간에 유지하고 있던 객체 내부의 정보와 객체 자신의 정보를 어디엔가 기록해 놓고 나중에 필요한 시기에 다시 볼수 있는 방법을 제공하는것이 객체직렬화 이다.
- 객체의 내용을 화일 혹은 네트워크를 통하여 byte stream으로 입출력
- 객체를 저장장치(파일, DB)등에 저장, 검색, 로딩 할 수 있도록 함으로서 객체의 영속성 제공
- 객체의 영속성을 위해 직렬화를 사용하여 꼭 필요한 데이터만 직렬화 하는 경량성을 제공
- java.io.Serializable 인터페이스 : 직렬화 가능 여부 판단
- java.lang.Object : 직렬화 안된다. 즉 객체를 스트림으로 보낼수 없다.
- java.lang.String : 직렬화 가능하며 객체를 스트림으로 보낼수 있다.
- Serializable을 구현한 창(Window)를 스트림으로 다른 컴퓨터에 보내는 것이 가능
- 직렬화 될때 static필드, transient필드는 제외
- 직렬화의 과정은 인스턴스 변수의 값을 저장하는 일인데 만약 인스턴스 변수가 다른 객체를 참조하고 있는 참조형의 변수일 경우 그 변수가 가리키는 객체 또한 직렬화 되어야 한다. 이렇게 직렬화는 복잡한 Tree형태로 계속 진행된다.
- 만약 참조형 변수가 가리키는 객체 또는 상위 클래스가 Serializable, Externalizable을 구현 하지 않았다면 직렬화가 되지 않으므로 제한적이나마 직렬화에 포함하기 위해서는 readObject 메소드및 writeObject를 적절히 프로그램 내부에 기록해 줌으로서 제한적이지만 가능한 방법을 제시한다(defaultReadObject, defaultWriteObject를 사용한다.)

OutputStream : ObjectOutputStream implements ObjectOutput
InputStream : ObjectInputStream implements ObjectInput
 
ObjectOutput 인테페이스 : 객체를 출력하기 위한 메쏘드 정의, DataOutput의 하위 인터페이스
writeObject(Object obj)

[ObjectOutput 예제]
 
import java.io.*;
class ObjectOutputTest
{
    public static void main(String[] args)
    {
        try {
            ObjectOutput s = new ObjectOutputStream(
                new FileOutputStream( "objectstream.dat" ) );
            s.writeObject( "Today" );
            s.writeObject( new java.util.Date() );
            s.flush();
        } catch( Exception e ) {
            e.printStackTrace(); }
    }
}

ObjectInput 인터페이스 : 객체를 입력하기 위한 메쏘드 정의, DataInput의 하위 인터페이스
Object readObject() throws ClassNotFoundException

[ObjectInput 예제]
 
import java.io.*;
class ObjectInputTest
{
    public static void main(String[] args)
    {
        try {
            ObjectInput s = new ObjectInputStream(
                new FileInputStream( "objectstream.dat" ) );
            String today = (String) s.readObject();
            java.util.Date date = (java.util.Date) s.readObject();
            System.out.println(today);
            System.out.println(date);
        } catch( Exception e ) {
            e.printStackTrace(); }
    }
}

java.io.Serializable 인터페이스 : 객체 직렬화를 위해서 반드시 구현해야
 

[AWT 직렬화 예제]
 
아래 프로그램을 실행시키면 윈도우 화면이 뜨는데... 종료될 때 AWTSerTest.ser 파일로 직렬화되어 저장된다.
(윈도우를 옮겨보고 내용도 써보자)
다시 프로그램을 실행시키면 직렬화시킨 파일에서 객체정보를 읽어 이전의 모양대로 실행된다.
 
import java.awt.*;
import java.awt.event.*;
import java.io.*;
 
class AWTSerTest extends Frame {

 TextArea view = new TextArea();
 public AWTSerTest() {
  add(view, "Center");
 }
 public static void main(String[] args) {
  Frame f = null;
  try {
   FileInputStream inFile = new FileInputStream("AWTSerTest.ser");
   ObjectInput in = new ObjectInputStream(inFile);
   f = (Frame)in.readObject();
  }
  catch(IOException ioe) {
   f = new AWTSerTest();
   f.setSize(500, 300);
  }
  catch(ClassNotFoundException e) {
   e.printStackTrace();
  }
  f.addWindowListener( new WindowAdapter() {
   public void windowClosing(WindowEvent we) {
    try {
     FileOutputStream outFile = new FileOutputStream("AWTSerTest.ser");
     ObjectOutput out = new ObjectOutputStream(outFile);
     out.writeObject(we.getWindow());
     out.close();
     System.exit(0);
    }
    catch(IOException e) {
     e.printStackTrace();
    }
   }
  });
  f.setVisible(true);
 }
}

댓글 없음:

댓글 쓰기