.NET의 XML 직렬화의 Java 아날로그는 무엇입니까?
.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 라이선스하에 있습니다).
우리는 우리 프로젝트 중 하나에서 평범한 오래된 자바 직렬화를 대체하기 위해 그것을 사용했으며 거의 즉시 작동했습니다.
Simple XML Serialization 프로젝트 를 살펴볼 수 있습니다 . .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 사양을 고수하는 경우이 메서드는 사용하기 쉽고 스키마가 필요하지 않습니다. 다음과 같은주의 사항이 있습니다.
예를 들어 다음 선언을 사용하십시오.
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
사용자 제공 데이터와 함께 사용 하면 코드에 임의 코드 실행 취약점이 발생할 수 있습니다.
XML로 직렬화 할 수있는 객체를 만들어야하는 경우 일반적으로 jaxb 또는 XMLBeans 를 사용합니다. 이제 XStream 이 방해가되지 않고 정말 간단한 API를 가지고 있기 때문에 매우 유용 할 수 있음을 알 수 있습니다. 나는 곧 그것을 가지고 놀 것이고 아마 그것을 사용할 것이다. 내가 알아 차린 유일한 단점은 상호 참조를 위해 객체의 ID를 직접 만들 수 없다는 것입니다.
@Barak Schiller
XStream에 링크를 게시 해 주셔서 감사합니다!
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;
}