developer tip

Java에서 XML 직렬화?

copycodes 2020. 8. 16. 21:00
반응형

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


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


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

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


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

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


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

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


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

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


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>

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


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

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


Usually I use jaxb or XMLBeans if I need to create objects serializable to XML. Now, I can see that XStream might be very useful as it's nonintrusive and has really simple api. I'll play with it soon and probably use it. The only drawback I noticed is that I can't create object's id on my own for cross referencing.

@Barak Schiller
Thanks for posting link to XStream!


Don't forget JiBX.


if you want a structured solution (like ORM) then JAXB2 is a good solution.

If you want a serialization like DOT NET then you could use Long Term Persistence of JavaBeans Components

The choice depends on use of serialization.


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;
}

참고URL : https://stackoverflow.com/questions/35785/xml-serialization-in-java

반응형