먼저, 후속 예제 데모를 위해 Classa 및 ClassB 등 Classa 및 ClassB를 정의하십시오.
코드 사본은 다음과 같습니다.
패키지 CN.LZRABBIT;
공개 클래스 클래스 {
개인 int Classaid;
개인 문자열 classaname;
개인 ClassB ClassB;
public int getClassaid () {
반품 클래스 아일;
}
공개 void setclassaid (int classaid) {
this.classaid = classaid;
}
공개 문자열 getClassAname () {
반환 classaname;
}
public void setclassaname (String Classaname) {
this.classaname = classaname;
}
public classb getClassb () {
반환 classb;
}
public void setclassb (classb classb) {
this.classb = classb;
}
}
Classa
코드 사본은 다음과 같습니다.
패키지 CN.LZRABBIT;
공개 클래스 클래스 B {
개인 INT Classbid;
개인 문자열 classBname;
공개 int getClassbid () {
반환 분류;
}
public void setclassbid (int classbid) {
this.classbid = classbid;
}
공개 문자열 getClassBname () {
반환 classBname;
}
public void setclassbname (string classbname) {
this.classbname = classBname;
}
}
클래스 B
직렬화를위한 xmlutil
코드 사본은 다음과 같습니다.
패키지 CN.LZRABBIT;
import java.io.stringReader;
import java.io.stringwriter;
import javax.xml.bind.*;
공개 클래스 xmlutil {
public static string toxml (Object obj) {
노력하다 {
jaxbcontext context = jaxbcontext.newinstance (obj.getclass ());
Marshaller Marshaller = context.createmarshaller ();
Marshaller.setProperty (Marshaller.jaxb_encoding, "utf-8"); // // 인코딩 형식
Marshaller.setProperty (Marshaller.jaxb_formatted_output, true); // 생성 된 XML 문자열을 포맷할지 여부
Marshaller.setProperty (Marshaller.jaxb_fragment, false); // XM 헤더 선언 정보를 생략할지 여부
StringWriter Writer = new StringWriter ();
Marshaller.marshal (Obj, Writer);
return writer.toString ();
} catch (예외 e) {
새로운 runtimeexception (e)을 던지십시오.
}
}
@suppresswarnings ( "확인되지 않은")
public static <t> t fromxml (String xml, class <t> valuetype) {
노력하다 {
jaxbcontext context = jaxbcontext.newinstance (valuetype);
UnmarShaller undshaller = context.createunmarshaller ();
return (t) unmarshaller.unmarshal (new StringReader (xml));
} catch (예외 e) {
새로운 runtimeexception을 던지십시오 (e.getMessage ());
}
}
}
xmlutil
통화는 다음과 같습니다.
코드 사본은 다음과 같습니다.
패키지 CN.LZRABBIT;
공개 클래스 메인 런 {
/**
* @param args
*/
public static void main (String [] args) {
classb classb = new classb ();
classb.setclassbid (22);
classb.setclassbname ( "b2");
classa classa = 새로운 classa ();
classa.setclassaid (11);
classa.setclassaname ( "a1");
classa.setclassb (classb);
System.out.println (xmlutil.toxml (classa));
}
}
메인
출력 결과는 다음과 같습니다.
코드 사본은 다음과 같습니다.
<? xml version = "1.0"encoding = "utf-8"standalone = "yes"?>
<classa>
<classaid> 11 </classaid>
<classaname> a1 </classaname>
<classb>
<cradbid> 22 </classbid>
<classbname> b2 </classbname>
</classb>
</classa>
다음은 몇 가지 점이 있습니다
1. 직렬화 된 클래스에 @xmlrootelement 주석을 추가하십시오. 그렇지 않으면 오류가보고됩니다 (오류 프롬프트가 매우 명확하므로 여기에 게시하지 않음).
2JAXB XML 직렬화 할 때 기본적으로 Getters 및 Setter를 직렬화하고 Getters와 Setter는 직렬화되기 전에 쌍으로 나타나야합니다.
3 속성 이름. 기본 직렬화 클래스 및 속성 이름은 기본적으로 소문자로 변환됩니다. 여기에주의를 기울여야 할 것은 @xmlelement가 getter 또는 setter에 배치 할 수 있지만 하나만 배치 할 수 있습니다. 즉, @xmlelement 주석이 Getter와 Setter에 동시에 사용할 수 없습니다.
4 루트 노드 이름을 제어하는 방법은 무엇입니까?
@xmlrootelement를 사용하여 @xmlrootelement (name = "classa")와 같은 이름 속성을 지정하십시오.
5 @xmlRootElement를 사용하여 네임 스페이스 속성을 지정하기 위해 네임 스페이스를 추가하는 방법 (네임 스페이스 = "CN.LZRABBIT")
6 각 속성 이름을 정확하게 제어하는 방법
JaxB를 소문자로 자동 변환하면 예측할 수없는 속성 이름이 나타나지 않으면 각 속성에 대해 @xmlelement (name = "")를 설정하십시오
7 세터와 getters 대신 필드 필드를 사용하여 직렬화를 구현하는 방법
사용하려는 클래스에 @xmlaccessortype (xmlaccesstype.field)로 지정하는 @xmlaccessortype (xmlaccesstype.field) 주석을 사용하는 것이 좋습니다. . 각 속성에 대한 @xmlelement (name = "") 주석을 설정하는 대신 필드에서 @xmlelement 주석을 사용할 수도 있습니다.
다음은 위의 주석을 사용하는 코드 예제입니다.
코드 사본은 다음과 같습니다.
@xmlrootelement (네임 스페이스 = "Cn.lzRabbit")
@xmlaccessortype (xmlaccesstype.field)
공개 클래스 클래스 {
개인 int Classaid;
@xmlelement (name = "classaname")
개인 문자열 classaname;
개인 ClassB ClassB;
public int getClassaid () {
반품 클래스 아일;
}
공개 void setclassaid (int classaid) {
this.classaid = classaid;
}
공개 문자열 getClassAname () {
반환 classaname;
}
public void setclassaname (String Classaname) {
this.classaname = classaname;
}
public classb getClassb () {
반환 classb;
}
public void setclassb (classb classb) {
this.classb = classb;
}
}
@xmlrootelement
@xmlaccessortype (xmlaccesstype.field)
공개 클래스 클래스 B {
개인 INT Classbid;
개인 문자열 classBname;
공개 int getClassbid () {
반환 분류;
}
public void setclassbid (int classbid) {
this.classbid = classbid;
}
공개 문자열 getClassBname () {
반환 classBname;
}
public void setclassbname (string classbname) {
this.classbname = classBname;
}
}
출력 XML은입니다
코드 사본은 다음과 같습니다.
<? xml version = "1.0"encoding = "utf-8"standalone = "yes"?>
<ns2 : classa xmlns : ns2 = "cn.lzrabbit">
<classaid> 11 </classaid>
<classaname> a1 </classaname>
<classb>
<cradbid> 22 </classbid>
<classbname> b2 </classbname>
</classb>
</ns2 : classa>
추신 : 참조를위한 몇 가지 온라인 도구는 다음과 같습니다.
온라인 XML/JSON 상호 전환 도구 :
http://tools.vevb.com/code/xmljson
형식 XML 온라인/XML 온라인 압축 :
http://tools.vevb.com/code/xmlformat
XML 온라인 압축/서식 도구 :
http://tools.vevb.com/code/xml_format_compress