首先定义两个示例类ClassA,ClassB,用于后续的示例演示 复制代码代码如下: package cn.lzrabbit; public class ClassA { private ClassB classB; public int getClassAId() { public void setClassAId(int classAId) { public String getClassAName() { public void setClassAName(String classAName) { public ClassB getClassB() { public void setClassB(ClassB classB) { ClassA 复制代码代码如下: package cn.lzrabbit; public class ClassB { public int getClassBId() { public void setClassBId(int classBId) { public String getClassBName() { public void setClassBName(String classBName) { ClassB 用于序列化的XmlUtil 复制代码代码如下: package cn.lzrabbit; import java.io.StringReader; import javax.xml.bind.*; public class XmlUtil { public static String toXML(Object obj) { Marshaller marshaller = context.createMarshaller(); @SuppressWarnings("unchecked") XmlUtil 调用如下: 复制代码代码如下: package cn.lzrabbit; public class MainRun { /** ClassB classB = new ClassB(); ClassA classA = new ClassA(); System.out.println(XmlUtil.toXML(classA)); } MainRun 输出结果如下: 复制代码代码如下: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <classA> <classAId>11</classAId> <classAName>A1</classAName> <classB> <classBId>22</classBId> <classBName>B2</classBName> </classB> </classA> 这里要注意以下几点 1要序列化的类加上 @XmlRootElement注解,否则会报错(错误提示很清晰,这里就不贴出来了) 2JAXB序列化XML时 默认序列化getter和setter,且getter和setter必须成对出现才会被序列化 3属性名称,默认序列化出来的类和属性名称默认是首字母转换为小写,若需要控制属性名称需要在getter或setter上使用 @XmlElement(name="ClassAId") 指定名称,这里要注意的是@XmlElement放置在getter或setter上都行,但只能放一个,也就是说不能同时在getter和setter上使用@XmlElement注解 4如何控制根节点名称? 5怎么添加命名空间 6怎么精确控制每个属性名称 7怎么样实现序列化时使用Field字段而不是使用setter和getter 下面给出使用了使用如上注解后的代码示例 复制代码代码如下: @XmlRootElement(namespace="cn.lzrabbit") @XmlAccessorType(XmlAccessType.FIELD) public class ClassA { private int classAId; @XmlElement(name="ClassAName") private String classAName; private ClassB classB; public int getClassAId() { public String getClassAName() { public void setClassAName(String classAName) { public ClassB getClassB() { public void setClassB(ClassB classB) { @XmlRootElement public int getClassBId() { public void setClassBId(int classBId) { public String getClassBName() { public void setClassBName(String classBName) { 输出xml为 复制代码代码如下: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:classA xmlns:ns2="cn.lzrabbit"> <classAId>11</classAId> <ClassAName>A1</ClassAName> <classB> <ClassBId>22</ClassBId> <ClassBName>B2</ClassBName> </classB> </ns2:classA> |
|