직렬화란?
객체의 직렬화는 객체의 내용을 바이트 단위로 변환하여 파일 또는 네트워크를 통해서 스트림(송수신)이 가능하게 하는것을 의미한다.

 자바 I/O 처리는 정수, 문자열, 바이트 단위의 처리만 지원했었다.따라서 복잡한 객체의 내용을 저장/복원하거나, 네트워크로 전송하기 위해서는 객체의 멤버변수의 각 내용을 일정한 형식으로 만들어(이것을 패킷이라고 한다) 전송해야 했다.

객체직렬화는 객체의 내용(구체적으로는 멤버변수의 내용)을 자바 I/O가 자동적으로 바이트 단위로 변환하여, 저장/복원하거나 네트워크로 전송할 수 있도록 기능을 제공해준다.

즉, 개발자 입장에서는 객체가 아무리 복잡하더라도, 객체직렬화를 이용하면 객체의 내용을 자바 I/O가 자동으로 바이트 단위로 변환하여 저장이나 전송을 해주게 된다.

또한 이것은 자바에서 자동으로 처리해주는 것이기 때문에, 운영체제가 달라도 전혀 문제되지 않는다.
객체를 직렬화할때 객체의 멤버변수가 다른 객체(Serializable 인터페이스를 구현한)의 레퍼런스 변수인 경우에는 레퍼런스 변수가 가리키는 해당 객체까지도 같이 객체직렬화를 해버린다.

또 그 객체가 다른 객체를 다시 가리키고 있다면, 같은 식으로 객체직렬화가 계속해서 일어나게 된다.이것은 마치 객체직렬화를 처음 시작한 객체를 중심으로 트리 구조의 객체직렬화가 연속적으로 일어나는 것이다.



 
직렬화의 장점 : 객제 내용을 입출력형식에 구해받지 않고 객체를 파일에 저장함으로써 영속성을 제공객체를 네트
워크를 통해 손쉽게 교환이 가능한다.

직렬화 사용이유?
   1. RMI(Remote Method Invocation)
      - RMI는 원격객체통신을 지원해야 하기때문에 객체가 그대로 이동해야대는데 이를위해 직렬화가 필요하다

   2. Beans
      - Beans는 설계시 상태정보를 지정할수 있는데 이때 객체직렬화를 사용하여 편하게 객체의 상태정보를 저장
    
  ※참고
[RMI]
자바프로그래밍 언어와 개발환경을 사용하여 서로 다른 컴퓨터상에 있는 객체들이 분산네크워크에서 상호작용하는 객체지향형 프로그램을 작성할수 있느 방식
  자세한내용 및 출처 : http://terms.co.kr/RMI.htm

[Beans]
자바빈즈는 썬 마이크로시스템즈에서 나온 객체지향 프로그래밍 인터페이스로서, 이것은 주요 운영체계플랫폼의 네트웍 내에 적용될 수 있는 재사용 가능 애플리케이션 또는 프로그램 빌딩블록, 즉 컴포넌트들을 구축할 수 있게 한다. 자바 애플릿처럼, 자바빈즈 컴포넌트들(일명 빈즈)도 이자율을 계산하거나, 사용자 또는 브라우저 특성에 맞게 페이지 내용을 변경하는 등, 웹페이지에 인터랙티브한 기능을 부여하는데 사용될 수 있다. 
  자세한내용 및 출처 : http://www.terms.co.kr/JavaBeans.htm


Serializable 인터페이스와 ObjectInputStream 클래스,ObjectOutputStream클래스

객체 직렬화를 하기 위해서 먼저 객체를 객체직렬화가 가능하도록 Serializable 인터페이스를 구현해야 합니다.그리고 ObjectInputStream 클래스와 ObjectOutputStream클래스는 객체를 입출력을 하기 위해 사용되는 클래스이다. 이들은 다 java.io 패키지에 정의되어 있는데요. 각각에 대해서 알아보자구요.


1> Serializable 인터페이스
객체 직렬화를 하기 위해서 먼저 객체를 객체직렬화가 가능하도록 Serializable 인터페이스를 구현해야 합니다. 
이 인터페이스는 객체직렬화가 제공되어야 함을 자바가상머신에 알려주는 역활을 하구요 .Serializable 인터페이스는 다른 인터페이스와는 달리 구현해야 할 메서드가 없으므로 단지 선언만 해주시면 됩니다.


2> ObjectInputStream 클래스
ObjectInputStream 클래스는 파일에 저장되어 있는 객체 또는 네트워크를 통해 직렬화되어전달된 객체를 직렬해제 하는 기능을 제공해 주고 있다.
한가지 주의할 점은, java.io.Serializable 인터페이스와 java.io.Externalizable 인터페이스를 지원해 주는 객체에 대해서만 가능하다는 것인데, 이는 등록된(즉 Serializable 인터페이스와 Externalizable 인터페이스를 구현한 클래스 객체) 객체를 말한다. 이 때, readObject 메소드를 이용하여 스트림으로부터 직렬화된 객체를 읽을 수 있습니다. 그리고, 이렇게 읽은 객체는 배열, 문자열, 또는 각 객체 등 원래의 형으로 캐스팅 해 주어야 합니다.


3> ObjectOutputStream 클래스
ObjectOutputStream 클래스는 객체들을 출력하는 기능을 제공해 주고,출력 스트림에 출력하기 전에 직렬화를 수행한다.
ObjectOutputStream 클래스는 자바 기본형 데이터 또는 객체들을 파일에 저장하거나 네트워크를 통해 전달하기 위해 전달할 객체를 직렬화하는 기능을 제공해 준다. 이 클래스도 역시 ObjectInputStream 클래스와 마찬가지로 java.io.Serializable 인터페이스와 java.io.Externalizable 인터페이스를 구현한 객체에 대해서만 가능하구요. 이 때, writeObject 메소드를 이용하여 스트림에 직렬화된 객체를 출력할 수 있습니다.

'Developer > Java' 카테고리의 다른 글

Swingv GUI 컴포넌트  (0) 2012.09.01
Swing vs AWT  (0) 2012.08.22
HashMap value를 정렬하는 방법  (0) 2012.07.18
Java GUI - JOptionPane  (0) 2012.07.12
배열의 복사  (0) 2012.07.04
Posted by No names
,