Java XML serialization: XMLEncoder/XMLDecoder example
July 29, 2010 18:46:57 Last update: July 29, 2010 18:48:15
This is an example of using
Java code
Test Output
By default, only Java beans can be serialized using
More advanced techniques are presented here: Using XMLEncoder
java.beans.XMLEncoder and java.beans.XMLDecoder to serialize/deserialize Java objects to XML.
Java code
- TestXMLEncoder.java:
import java.io.*; import java.beans.XMLEncoder; import java.beans.XMLDecoder; public class TestXMLEncoder { public static void main(String[] args) throws Exception { TestXMLEncoder t = new TestXMLEncoder(); t.testSimpleBean(); t.testCompositeBean(); t.testNoDefaultConstructor(); } private void testSimpleBean() throws Exception { System.out.println("Testing simple bean"); File simpleBeanXml = new File("simplebean.xml"); SimpleBean b = new SimpleBean(); b.setName("Java"); encodeObject(b, simpleBeanXml); SimpleBean b2 = (SimpleBean) decodeObject(simpleBeanXml); System.out.println("Retrieved: " + b2); System.out.println(); } private void testCompositeBean() throws Exception { System.out.println("Testing composite bean"); File compositeBeanXml = new File("compositebean.xml"); CompositeBean b = new CompositeBean(); SimpleBean s = new SimpleBean(); s.setName("Nested"); b.setS(s); encodeObject(b, compositeBeanXml); CompositeBean b2 = (CompositeBean) decodeObject(compositeBeanXml); System.out.println("Retrieved: " + b2); System.out.println(); } private void testNoDefaultConstructor() throws Exception { System.out.println("Testing noDefaultConstructor"); File noDefaultXml = new File("nodefault.xml"); NotABean b = new NotABean("NotBean"); encodeObject(b, noDefaultXml); NotABean b2 = (NotABean) decodeObject(noDefaultXml); System.out.println("Retrieved: " + b2); System.out.println(); } void encodeObject(Object o, File xmlFile) throws IOException { XMLEncoder encoder = new XMLEncoder( new FileOutputStream(xmlFile) ); encoder.writeObject(o); encoder.close(); } Object decodeObject(File xmlFile) throws IOException { XMLDecoder decoder = new XMLDecoder( new FileInputStream(xmlFile) ); Object o = decoder.readObject(); decoder.close(); return o; } }
- SimpleBean.java:
public class SimpleBean { private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String toString() { return String.format("[%s] %s", this.getClass().getName(), getName() ); } }
- CompositeBean.java:
public class CompositeBean { private SimpleBean s; public SimpleBean getS() { return s; } public void setS(SimpleBean s) { this.s = s; } public String toString() { return String.format("[%s] %s", this.getClass().getName(), getS().getName() ); } }
- NotABean.java:
public class NotABean { private String name; public NotABean(String name) { this.name = name; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String toString() { return String.format("[%s] %s", this.getClass().getName(), getName() ); } }
Test Output
By default, only Java beans can be serialized using
XMLEncoder. Exception occurs when you try to deserialize an object which is not a Java bean. Errors actually occur when you try to serialize, but they are ignored. As a result, an XML file is generated by the serialization but the file is useless!
- Console output:
C:\>java TestXMLEncoder Testing simple bean Retrieved: [SimpleBean] Java Testing composite bean Retrieved: [CompositeBean] Nested Testing noDefaultConstructor java.lang.InstantiationException: NotABean Continuing ... java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(NotABean); Continuing ... Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at com.sun.beans.ObjectHandler.dequeueResult(ObjectHandler.java:139) at java.beans.XMLDecoder.readObject(XMLDecoder.java:201) at TestXMLEncoder.decodeObject(TestXMLEncoder.java:62) at TestXMLEncoder.testNoDefaultConstructor(TestXMLEncoder.java:44) at TestXMLEncoder.main(TestXMLEncoder.java:10)
- simplebean.xml:
<?xml version="1.0" encoding="UTF-8"?> <java version="1.6.0_20" class="java.beans.XMLDecoder"> <object class="SimpleBean"> <void property="name"> <string>Java</string> </void> </object> </java>
- compositebean.xml:
<?xml version="1.0" encoding="UTF-8"?> <java version="1.6.0_20" class="java.beans.XMLDecoder"> <object class="CompositeBean"> <void property="s"> <object class="SimpleBean"> <void property="name"> <string>Nested</string> </void> </object> </void> </object> </java>
- nodefault.xml:
<?xml version="1.0" encoding="UTF-8"?> <java version="1.6.0_20" class="java.beans.XMLDecoder"> </java>
More advanced techniques are presented here: Using XMLEncoder