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 일이었습니다. Simple
JAXB만큼 쉽고 간단 해 보이지만 기업용으로 평가할 라이선스 정보를 찾을 수 없습니다.
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
'developer tip' 카테고리의 다른 글
Hash 기본값 (예 : Hash.new ([]))을 사용할 때 이상하고 예상치 못한 동작 (값 사라짐 / 변경) (0) | 2020.08.16 |
---|---|
argc가 상수가 아닌 이유는 무엇입니까? (0) | 2020.08.16 |
NSDefaultRunLoopMode 대 NSRunLoopCommonModes (0) | 2020.08.16 |
Kyle Simpson의 OLOO 패턴과 프로토 타입 디자인 패턴 (0) | 2020.08.16 |
Html.RenderPartial로 인해 이상한 과부하 오류가 발생합니까? (0) | 2020.08.16 |