Java XML serialization: XMLEncoder/XMLDecoder example 

Joined:
04/09/2007
Posts:
753

July 29, 2010 18:46:57    Last update: July 29, 2010 18:48:15
This is an example of using java.beans.XMLEncoder and java.beans.XMLDecoder to serialize/deserialize Java objects to XML.

Java code
  1. 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;
        }
    }
    


  2. 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()
    	       );
        }
    }
    


  3. 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()
    	       );
    
        }
    }
    


  4. 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!
  1. 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)
    


  2. 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>
    


  3. 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>
    


  4. 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
Share |
| Comment  | Tags