문제

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

도움이 되었습니까?

해결책

2008년 답변이에 대한 "공식" Java API는 이제 JAXB - XML ​​바인딩용 Java API입니다.보다 Oracle의 튜토리얼.참조 구현은 다음 위치에 있습니다. http://jaxb.java.net/

2018년 업데이트 참고하세요 Java EE 및 CORBA 모듈은 JDK9의 SE에서 더 이상 사용되지 않으며 JDK11의 SE에서 제거됩니다..따라서 JAXB를 사용하려면 예를 들어 번들로 제공되는 기존 엔터프라이즈급 환경에 있어야 합니다.앱 서버를 사용하지 않으면 수동으로 가져와야 합니다.

다른 팁

엑스스트림 많은 구성과 비용 없이 객체를 XML로 직렬화하는 데 꽤 능숙합니다!(BSD 라이센스하에 있습니다).

우리는 프로젝트 중 하나에서 이를 사용하여 기존의 일반 Java 직렬화를 대체했으며 거의 ​​즉시 작동했습니다.

"간단한 XML 직렬화" 프로젝트

당신은 간단한 XML 직렬화 프로젝트.이는 .Net의 System.Xml.Serialization과 가장 가까운 것입니다.

JAXB는 JDK 표준 버전 버전 1.6+의 일부입니다.그래서 그렇습니다 FREE 다운로드하고 관리할 추가 라이브러리가 없습니다.간단한 예를 찾을 수 있습니다 여기

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

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

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

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

예를 들어 다음 선언을 살펴보겠습니다.

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

보통 내가 사용하는 잭스비 또는 XMLBeans XML로 직렬화 가능한 객체를 생성해야 하는 경우.이제 알 수 있어요 엑스스트림 비침해적이고 매우 간단한 API를 갖고 있기 때문에 매우 유용할 수 있습니다.곧 가지고 놀아서 아마 사용할 것 같아요.내가 알아차린 유일한 단점은 상호 참조를 위해 객체의 ID를 스스로 생성할 수 없다는 것입니다.

@바락 쉴러
XStream에 대한 링크를 게시해 주셔서 감사합니다!

잊지 마세요 JiBX.

당신이 원한다면 구조화된 솔루션 (ORM과 같은) JAXB2가 좋은 솔루션입니다.

DOT NET과 같은 직렬화를 원한다면 다음을 사용할 수 있습니다. JavaBeans 구성 요소의 장기간 지속성

선택은 직렬화 사용에 따라 달라집니다.

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top