(자바/JAVA/자바교육)객체 직렬화(object serialization), 자바강의/자바동영상/자바강좌/JAVA교육/JAVA동영상,JAVA강의/JAVA강좌
1. 객체 직렬화(object serialization)
객체는 클래스를 통해 필요 한 시기에 생성되며 프로그램이 종료되지 않더라도 소멸된다. 물론 프로그램이 종료하면 사라진다.
실행 시간에 유지하고 있던 객체 내부의 정보와 객체 자신의 정보를 어디엔가 기록해 놓고 나중에 필요한 시기에 다시 볼 수 있는 방법을 제공하는 것이 객체 직렬화 이다.
객체의 내용을 화일 혹은 네트워크를 통하여 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
객체를 출력하기 위한 메소드 정의
DataOutput의 하위 인터페이스
writeObject(Object obj)
class ObjectOutputTest {
public static void main(String[] args) {
try {
ObjectOutput s = new ObjectOutputStream(
new FileOutputStream( "ObjectOutput.dat" ) );
s.writeObject( “Hello~" );
s.writeObject( new java.util.Date() );
s.flush();
} catch( Exception e ) {
e.printStackTrace(); }
}
}
객체를 입력하기 위한 메소드 정의
DataInput의 하위 인터페이스
Object readObject() throws ClassNotFoundException
class ObjectInputTest {
public static void main(String[] args) {
try {
ObjectInput s = new ObjectInputStream(
new FileInputStream( "ObjectOutput.dat" ) );
String hello = (String) s.readObject();
java.util.Date date = (java.util.Date) s.readObject();
System.out.println(hello);
System.out.println(date);
} catch( Exception e ) {
e.printStackTrace(); }
}
}
Hello~
Thu Sep 24 08:45:16 KST 2020
2. AWT 윈도우 객체직렬화 실습
package javatest;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
public class AwtTest extends Frame {
TextArea view = new TextArea();
// 윈도우가 생성될 때 가운데 위치시킴
public AwtTest() {
add(view, "Center");
}
public static void main(String[] args) {
Frame f = null;
try {
// 파일이 있으면 객체직렬화로 저장된 윈도우를 읽어옴
FileInputStream inFile = new FileInputStream("AwtTest.dat");
ObjectInput in = new ObjectInputStream(inFile);
f = (Frame)in.readObject();
}
catch(IOException ioe) {
// 파일이 없다면(최초실행되는 경우) 500, 300자리 윈도우 생성
f = new AwtTest();
f.setSize(500, 300);
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
// 윈도우 종료 이벤트 핸들러 처리
f.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent we) {
try {
FileOutputStream outFile = new FileOutputStream("AwtTest.dat");
ObjectOutput out = new ObjectOutputStream(outFile);
out.writeObject(we.getWindow());
out.close();
System.exit(0);
}
catch(IOException e) {
e.printStackTrace();
}
}
});
f.setVisible(true);
}
}
#자바직렬화, #자바객체직렬화, #ObjectInputStream, #ObjectOutputStream, #자바, #JAVA, #자바동영상, #자바강의, #자바교육, #자바강좌, #자바동영상강의, #추천자바강의, #추천자바강좌, #JAVA동영상, #JAVA강의, #JAVA강좌, #JAVA교육, #JAVA, #추천JAVA강의, #추천JAVA교육, #추천JAVA강좌, #자바소스, #자바온라인교육, #자바온라인강의