Java XMLEncoder에서 객체 저장,XMLDecoder으로 복원
Java에서 개체XML 형식에서 저장할 샘플 프로그램을 소개합니다.
XML 출력은java.beans.XMLEncoder를 사용합니다.
또java.beans.XMLDecoder를 사용하여 저장된 객체를 복원하는 샘플 프로그램도 동시에 소개합니다.
샘플 프로그램
- 비공개로 선언된 필드는 Getter 및 Setter 메서드를 정의할 때 저장됩니다.
- 변수가 변경된 경우에만 XML 파일에 저장됩니다.
- 보존하는 오브젝트는 java.util.HashMap나, java.util.ArrayList등도 지정할 수 있습니다. 간단히 객체의 상태를 저장하는 데 유용합니다.
// 바이트 데이터를 파일로 출력
fileStream = new FileOutputStream(path);
fileStream.write(xmlbuff);
fileStream.flush();
} finally {
if (enc != null) {
enc.close();
}
if (out != null) {
out.close();
}
if (fileStream != null) {
fileStream.close();
}
}
}
/**
* 지정된 경로 [path]의 XML 파일에서 객체를 복원합니다.
* ※XML 파일은 java.beans.XMLEncoder로 저장하고 있어야 합니다.
* @param path 오브젝트가 저장된 경로.
* @throws FileNotFoundException
* 지정된 경로명으로 표시되는 파일이 존재하지 않는 경우
*/
public static Object readXML (String path) throws FileNotFoundException {
XMLDecoder d = null;
try {
d = new XMLDecoder (new BufferedInputStream (
새로운 FileInputStream (path)));
return d.readObject();
} finally {
if (d != null) {
d.close();
}
}
}
※보존하는 클래스의 샘플로서, 이하의 클래스를 사용합니다.
실행 결과
◆실행예
// XML에서 FreeSoft 클래스의 인스턴스 복원
FreeSoft freeSoft2 = (FreeSoft)readXML(“C:\\FreeSoft.xml”);
System.out.println(“소프트 이름:”+freeSoft2.getName());
System.out.println(“URL:”+freeSoft2.getUrl());
} catch (Exception e) {
e.printStackTrace();
}
}
◆출력 결과
소프트 이름: Chat & Messenger 채팅도 메신저도! ! URL: https://chat-messenger.com/
◆C:\\FreeSoft.xml의 내용
이용하는 경우의 주의점
편리한 java.beans.XMLEncoder, java.beans.XMLDecoder 클래스입니다만, Chat&Messenger 로 실천적으로 이용하면, 매우 레어 케이스입니다만, java.beans.XMLEncoder 로 XML에 출력시, 파일이 0 바이트가 되는 문제를 확인 중입니다.
0바이트의 파일을 읽으면 「표준 에러 출력」에 ParseException가 기록됩니다.
이 원인은 FileOutputStream 의 인스턴스를 생성한 시점으로, 파일은 비워져 버립니다.
FileOutputStream 인스턴스 생성 후 XML 데이터를 출력하기 전에 Java 프로세스가 종료되면 발생한다고 생각합니다.
Chat&Messenger는 이 문제로 인해 백업 파일을 만들고 문제를 해결합니다.