在Java对象的XML序列化和反序列化(1)和Java对象的XML序列化和反序列化(2)介绍了利用java.beans.XMLEncoder/XMLDecoder实现Java对象的XML序列化和反序列化。从XMLEncoder的输出结果来看,产生的XML序列包含了太多的描述信息,看上去很不直观。而且XMLEncoder在对纯数据对象进行序列化的时候,生成的XML代码简直就是一团乱麻。
在实际应用中,往往希望根节点名对应类名、节点名对应类成员名,节点值对应类成员值,有什么工具类可以实现这一点呢?答案就是JAXB(Java Architecture for XML Binding),使用非常简单,生成的XML代码简洁明了,与被序列化的Java对象对应关系非常好。
下面是使用JAXB对纯数据对象进行XML序列化和反序列化的例子:
纯数据对象代码如下:
public class PureDataObject { public PureDataObject() { } public PureDataObject(int id, String name, double value, boolean valid) { this.id = id; this.name = name; this.value = value; this.valid = valid; } public int id; public String name; public double value; public boolean valid; }
import javax.xml.bind.JAXB; public class XmlSerialize { public XmlSerialize() { } public void runJAXB() { String xmlFile = ".\\jaxb.xml"; PureDataObject pdo4Out = new PureDataObject(1024, "Hello, JAXB !", 1.732, true); // 创建待序列化的对象 JAXB.marshal(pdo4Out, xmlFile); PureDataObject pdo4In = JAXB.unmarshal(xmlFile, pdo4Out.getClass()); System.out.println("id: " + pdo4In.id); System.out.println("name: " + pdo4In.name); System.out.println("value: " + pdo4In.value); System.out.println("valid: " + pdo4In.valid); } public static void main(String[] args) { XmlSerialize xs = new XmlSerialize(); xs.runJAXB(); } }
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <pureDataObject> <id>1024</id> <name>Hello, JAXB !</name> <value>1.732</value> <valid>true</valid> </pureDataObject>
然而,需要注意的是,Java类中的非公有成员无法被序列化。