2014년 5월 13일 화요일

[오라클자바커뮤니티]자바 객체직렬화, Java Object Serialization, AWT직렬화예제, ObjectInput, ObjectOutput

[오라클자바커뮤니티]자바 객체직렬화, Java Object Serialization, AWT직렬화예제, ObjectInput, ObjectOutput
 
- 객체는 클래스를 통해 필요 한 시기에  생성되며 프로그램이 종료하지 않더라도  소멸된다. 물론 프로그램이 종료하면 사라진다. 실행시간에 유지하고 있던 객체 내부의 정보와 객체 자신의 정보를 어디엔가 기록해 놓고 나중에 필요한 시기에 다시 볼수 있는 방법을 제공하는것이 객체직렬화 이다.
- 객체의 내용을 화일 혹은 네트워크를 통하여 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);
 }
}
오라클자바커뮤니티 오프라인 교육센터, 개발자 전문교육, 개인80%환급 www.oraclejavacommunity.com

평일주간(9:30~18:20) 개강
(5/19)C#4.0,ADO.NET,Network 프로그래밍
(5/19)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(5/21)[교육전취업확정]Spring,MyBatis,XPlatform실무프로젝트과정
(5/26)SQL초보에서실전전문가까지
(5/26)안드로이드개발자과정
(5/26)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(5/27)JAVA,ORACLE 실무개발자과정
(5/30)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지

평일야간(19:00~21:50) 개강
(5/16)C#,ASP.NET마스터
(5/19)웹퍼블리싱 마스터
(5/21)Spring3.X, MyBatis, Hibernate실무과정
(5/21)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(5/22)안드로이드개발자과정
(5/23)SQL초보에서실전전문가까지
(5/29)JAVA&WEB프레임워크실무과정

주말(10:00~17:50) 개강
(5/17)Spring3.X, MyBatis, Hibernate실무과정
(5/17)C#,ASP.NET마스터
(5/17)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(5/24)안드로이드개발자과정
(5/24)SQL초보에서실전전문가까지
(5/24)실무예제로 배워보는 jQuery(개발자/디자이너를위한)

주말저녁(18:30~22:20) 개강
(5/24)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지

 
 

댓글 없음:

댓글 쓰기