Java에서 XML 직렬화? [닫은]


104

.NET의 XML 직렬화의 Java 아날로그는 무엇입니까?


6
아, 이렇게 한 줄짜리 질문이 이렇게 환영 받던 영광스러운 옛날. 매우 유용합니다. "무엇을 시도해 보셨습니까?"/ "세부 정보 제공"이라는 말이없는 사람들은 오늘 읽고 싶어합니다.
GOTO 0

답변:


81

2008 답변 "공식"Java API는 이제 JAXB-Java API for XML Binding입니다. Oracle의 Tutorial을 참조하십시오 . 참조 구현은 http://jaxb.java.net/에 있습니다.

2018 업데이트 합니다 자바 EE와 CORBA 모듈 JDK9에 SE에서 사용되지 않으며 JDK11에 SE에서 제거 . 따라서 JAXB를 사용하려면 앱 서버에서 번들로 제공하는 기존 엔터프라이즈 클래스 환경에 있어야하거나 수동으로 가져와야합니다.


2
맞습니다, JAXB는 확실히 최고의 옵션입니다!
ivan_ivanovich_ivanoff 2009

1
JAXB는 Java 10부터 표준 Java 배포에서 제거되었으므로 이미 번들로 제공되는 컨텍스트에서 작동하지 않는 한 원하는 경우 애플리케이션과 함께 번들로 제공해야하는 라이브러리가되었습니다.
Theodore Murdock

69

XStream 은 많은 구성과 비용 없이도 객체를 XML로 직렬화하는 데 매우 능숙합니다! (BSD 라이선스하에 있습니다).

우리는 우리 프로젝트 중 하나에서 평범한 오래된 자바 직렬화를 대체하기 위해 그것을 사용했으며 거의 ​​즉시 작동했습니다.


3
매우 유용하지만 문자열이 아닌 노드 객체가있는 JGraph와 같은 복잡한 트리 구조에서 문제가 발생할 수 있습니다.
mikek3332002 2010-06-03

간단하고 더 나은 다음 다른 솔루션
daitangio

나는 XStream을 좋아한다. 유일한 것은 실제 XML 앞에 문자가 추가되는 이유를 이해하지 못한다는 것입니다.
James P.

17

"단순 XML 직렬화"프로젝트

Simple XML Serialization 프로젝트 를 살펴볼 수 있습니다 . .Net의 System.Xml.Serialization에서 가장 가까운 것입니다.


그러나 각 필드에 대한 매핑 주석이 필요합니다.
mP.

1
사실이 아닙니다. 나는 요구하지 않습니다. 기본 동작을 변경할 수 있으며 현재 필드 만 사용합니다.
damluar 2011

1
나는 또한 "단순" 을 진심으로지지 한다. 나는 큰 성공을 거둔 몇 가지 프로젝트에서 그것을 사용했습니다. "단순"은 실제로 JAXB보다 훨씬 간단합니다. 비교적 간단한 요구 사항이있을 때 가장 적합합니다. 나중에 다시 개체로 재수 화되기 위해 저장소에 기록해야하는 개체가 있습니다. JAXB는 훨씬 더 많은 기능과 유연성을 가지고 있지만 "80/20"종류의 것입니다. 대부분의 프로젝트에서 대부분의 경우 간단한 기능 하위 집합 만 필요할 수 있습니다.
Basil Bourque 2015

1 : 1 매핑을 원하는 경우 잘 작동합니다. 클래스가 발전하고 여전히 이전 XML을 역 직렬화해야하는 경우 문서와 오류 메시지가 모두 다소 모호하기 때문에 문제가 발생합니다. 문제를 진단하는 것은 일반적으로 가능하지만 문제를 해결하는 방법을 찾는 데 며칠이 걸릴 수 있습니다.
toolforger

13

JAXB는 JDK 표준 에디션 버전 1.6+의 일부입니다. 따라서 FREE다운로드 및 관리 할 추가 라이브러리가 없습니다. 간단한 예는 여기 에서 찾을 수 있습니다 .

XStream이 죽은 것 같습니다. 마지막 업데이트는 2008 년 12 월 6 일이었습니다. SimpleJAXB만큼 쉽고 간단 해 보이지만 기업용으로 평가할 라이선스 정보를 찾을 수 없습니다.


4
XStream은 죽지 않고 성숙하고 안정적입니다. 즉, 핵심 기능에 추가 할 것이 많지 않습니다. JAXB 참조 구현의 경우에도 마찬가지이며 지난 몇 년 동안 많은 활동이 없었습니다.
StaxMan 2011 년

9

1.4 버전부터 Java에는 java.beans.XMLEncoder 및 java.beans.XMLDecoder 클래스가있었습니다. 이러한 클래스는 최소한 XML 직렬화와 매우 유사한 XML 인코딩을 수행하며 일부 상황에서는 트릭을 수행 할 수 있습니다.

클래스가 getter 및 setter에 대한 JavaBeans 사양을 고수하는 경우이 메서드는 사용하기 쉽고 스키마가 필요하지 않습니다. 다음과 같은주의 사항이 있습니다.

  • 일반 Java 직렬화와 마찬가지로
    • InputStream 및 OutputStream을 통해 실행되는 코딩 및 디코딩
    • 이 프로세스는 친숙한 writeObject 및 readObject 메서드를 사용합니다.
  • 일반 Java 직렬화와 달리
    • 인코딩뿐만 아니라 디코딩으로 인해 생성자와 이니셜 라이저가 호출됩니다.
    • 클래스가 Serializable을 구현하는지 여부에 관계없이 인코딩 및 디코딩이 작동합니다.
    • 일시적 수정자는 고려되지 않습니다.
    • 공용 생성자가있는 공용 클래스에서만 작동합니다.

예를 들어 다음 선언을 사용하십시오.

public class NPair {
  public NPair() { }
  int number1 = 0;
  int number2 = 0;
  public void setNumber1(int value) { number1 = value;}
  public int getNumber1() { return number1; }
  public void setNumber2(int value) { number2 = value; }
  public int getNumber2() {return number2;}
}

이 코드 실행 :

NPair fe = new NPair();
fe.setNumber1(12);
fe.setNumber2(13);
FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml");
java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1);
xe1.writeObject(fe);
xe1.close();

다음 파일이 생성됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_02" class="java.beans.XMLDecoder">
 <object class="NPair">
  <void property="number1">
   <int>12</int>
  </void>
  <void property="number2">
   <int>13</int>
  </void>
 </object>
</java>

java.beans.XMLDecoder사용자 제공 데이터와 함께 사용 하면 코드에 임의 코드 실행 취약점이 발생할 수 있습니다.
aventurin

2

XMLBeans 는 XML에 대한 스키마가있는 경우 훌륭하게 작동합니다. 스키마에 대한 Java 개체를 만들고 사용하기 쉬운 구문 분석 메서드를 만듭니다.


0

객체의 자동 XML 직렬화에 대해 이야기하고 있다면 Castor를 확인하십시오 .

Castor는 Java [tm] 용 오픈 소스 데이터 바인딩 프레임 워크입니다. Java 객체, XML 문서 및 관계형 테이블 간의 최단 경로입니다. Castor는 Java-to-XML 바인딩, Java-to-SQL 지속성 등을 제공합니다.


0

XML로 직렬화 할 수있는 객체를 만들어야하는 경우 일반적으로 jaxb 또는 XMLBeans 를 사용합니다. 이제 XStream 이 방해가되지 않고 정말 간단한 API를 가지고 있기 때문에 매우 유용 할 수 있음을 알 수 있습니다. 나는 곧 그것을 가지고 놀 것이고 아마 그것을 사용할 것이다. 내가 알아 차린 유일한 단점은 상호 참조를 위해 객체의 ID를 직접 만들 수 없다는 것입니다.

@Barak Schiller
XStream에 링크를 게시 해 주셔서 감사합니다!


문제는 jaxb 및 xmlbeans에 매핑 스키마가 필요하며 자동 ...
mP가 아닙니다.



-1
public static String genXmlTag(String tagName, String innerXml, String properties )
{
    return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName);
}

public static String genXmlTag(String tagName, String innerXml )
{
    return genXmlTag(tagName, innerXml, "");
}

public static <T> String serializeXML(List<T> list)
{
    String result = "";
    if (list.size() > 0)
    {
        T tmp = list.get(0);
        String clsName = tmp.getClass().getName();
        String[] splitCls = clsName.split("\\.");
        clsName = splitCls[splitCls.length - 1];
        Field[] fields = tmp.getClass().getFields();

        for (T t : list)
        {
            String row = "";
            try {
                for (Field f : fields)
                {
                    Object value = f.get(t);
                    row += genXmlTag(f.getName(), value == null ? "" : value.toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            row = genXmlTag(clsName, row);

            result += row;
        }
    }

    result = genXmlTag("root", result);
    return result;
}

많은 문제 : Class # getSimpleName의 재창조 *** PropertyDescriptor의 재창조 *** 모든 속성이 액세스 가능한 필드라고 가정합니다. *** 반사 결과를 캐시하지 않습니다 (느림) *** 아무것도 사용자 정의 할 방법이 없습니다 (예 : 클래스와 파일 이름) *** 없음 직렬화
toolforger하지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.