java.beans.XMLDecoder와 java.beans.XMLEncoder를 이용한 Java객체의 xml 변환

자바 객체와 XML간의 변환에관해서는 몇 가지 라이브러리들이 존재하고 있습니다만 이번 시간에는 Java SDK에
기본으로 포함되어 있는 java.beans.XMLDecoder와 java.beans.XMLEncoder를 이용하여 자바객체<->XML간
변환 방법을 알아보겠습니다.

java.beans.XMLDecoder와 java.beans.XMLEncoder클래스는 J2SE 1.4 버전부터 이용할 수 있습니다.

우선, XML로 변환하고 XML로부터 복원할  적당한 자바 클래스를 작성합니다.
[code]
/*
 * Setter와 Getter를 가진 전형적인 JavaBean 클래스입니다.
 */

package com.yunsobi.beanxmltranslate;

import java.awt.Point;
import java.util.ArrayList;

/**
 *
 * @author 신윤섭
 */
public class SampleBean {
    private int[] scores;
    private String name;
    private Point seat;
    private ArrayList entry;

    public int[] getScores() {
 return scores;
    }

    public void setScores(int[] scores) {
 this.scores = scores;
    }

    public String getName() {
 return name;
    }

    public void setName(String name) {
 this.name = name;
    }

    public Point getSeat() {
 return seat;
    }

    public void setSeat(Point seat) {
 this.seat = seat;
    }

    public ArrayList getEntry() {
 return entry;
    }

    public void setEntry(ArrayList entry) {
 this.entry = entry;
    }

}

[/code]
보시면 아시겠지만 int 배열과 String, Point, ArrayList 객체를 갖는 전형적인 자바빈 객체 하나를 만들었습니다.

이제, 이 SampleBean 클래스를 xml로 변환하고 변환한 xml로 부터 SampleBean객체를 복원하는 코드를 작성합니다.
[code]
/*
 * java.beans.XMLDecoder와 java.beans.XMLEncoder는
 * Java객체를 XML로
 * XML에서 Java 객체로 변환하는 쉬운 방법을 제공 합니다.
 */
package com.yunsobi.beanxmltranslate;

import java.awt.Point;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;

/**
 *
 * @author 신윤섭
 */
public class BeanXmlTranslator {

    public static void main(String args[]) throws Exception {
 
 //xml로 변환할 클래스를 생성
 SampleBean sample = new SampleBean();
 //파라메터를 세팅해 봅시다.
 sample.setScores(new int[]{100, 90, 75}); //int[]
 sample.setName("Gore"); //String
 sample.setSeat(new Point(5, 3)); //java.awt.Point
 //ArrayList에 String과 Point도 넣어보구요..
 ArrayList entry = new ArrayList();
 entry.add("우리는");
 entry.add("하나다");
 entry.add(new Point(1,1));
 sample.setEntry(entry);
 
 //자.. 객체를 XML로 변환 시킵니다.
 XMLEncoder encoder = new XMLEncoder(
     new BufferedOutputStream(
     new FileOutputStream("C:\\Sample.xml")));
 encoder.writeObject(sample);
 encoder.close();
 //객체 레퍼런스를 찍어보구요..
 System.out.println(sample);
 
 //이젠 XML에서 객체로 복원시켜 봅니다.
 XMLDecoder decoder = new XMLDecoder(
     new BufferedInputStream(
     new FileInputStream("C:\\Sample.xml")));
 SampleBean sample2 = (SampleBean) decoder.readObject();
 decoder.close();
 //객체 레퍼런스를 찍어보구요..
 System.out.println(sample2);
    }
}

[/code]
예.. 변환의 핵심은 XMLEncoder 클래스의 writeObject() 메소드와 XMLDecoder  클래스의 readObject() 메소드
에 있습니다.

객체를 xml로 변환한 결과를 한번 볼까요?
[code]
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0_13" class="java.beans.XMLDecoder">
 <object class="com.yunsobi.beanxmltranslate.SampleBean">
  <void property="entry">
   <object class="java.util.ArrayList">
    <void method="add">
     <string>우리는</string>
    </void>
    <void method="add">
     <string>하나다</string>
    </void>
    <void method="add">
     <object class="java.awt.Point">
      <int>1</int>
      <int>1</int>
     </object>
    </void>
   </object>
  </void>
  <void property="name">
   <string>Gore</string>
  </void>
  <void property="scores">
   <array class="int" length="3">
    <void index="0">
     <int>100</int>
    </void>
    <void index="1">
     <int>90</int>
    </void>
    <void index="2">
     <int>75</int>
    </void>
   </array>
  </void>
  <void property="seat">
   <object class="java.awt.Point">
    <int>5</int>
    <int>3</int>
   </object>
  </void>
 </object>
</java>

[/code]
객체의 타입과 할당된 값이 깔끔한 xml문서로 작성된것을 확인 하실 수 있습니다.

자바에는 객체 직렬화(Serialize) 란게 있지요..
위 XMLDecoder와 XMLEncoder가 직렬화 기능을 이용하는건지 아닌지 확인 해 볼까요?
가장 정확한 방법은 XMLDecoder와 XMLEncoder의 소스를 보는것이겠지만 이미 위 예제 소스만으로도
충분히 예상 하실 수 있습니다. 위 예제의 SampleBean 이 Serializable 하지 않음에도 xml문서로 생성되었습니다.
예.. XMLDecoder와 XMLEncoder 내부적으로 java Reflection을 이용하여 xml, 객체간 변환을 수행하고 있습니다.

java Reflection을 이용한다고 했습니다. 이는 getXXX, setXXX 메소드가 없다면 해당 변수를 xml로 만들어내지
못하고 객체로 복원해 내지도 못함을 의미합니다.

또 하나, XMLEncoder를 통해 변환된 xml은 문서의 형태로 보아도 외부 시스템과의 정보의 교환보다는
객체의 상태저장/복원을 목적으로 사용하는게 더 어울릴거란 생각이 드네요.

2009/01/08 21:01 2009/01/08 21:01
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다