Skip to main content

JAXB - Marshalling and Unmarshalling object in Java

JAXB, stands for Java Architecture for XML Binding, which can be used to convert a Java object to XML file or a XML document to corresponding Java Object.

Given below are the two terminologies used in Java for the conversions.

Marshalling - Convert a Java object to XML file
Unmarshalling - Convert a XML file to Java object.

Here we have a class called Car which contains object of another class called Wheel. The UML diagram is as below.


First we will need to write  the class Car as follows.

 import javax.xml.bind.annotation.XmlRootElement;  
 @XmlRootElement    // This annotation is required to indicate that this is the top level class
 public class Car {  
      Wheel wheel;  
      String color;  
      public Wheel getWheel() {  
           return wheel;  
      }  
      public void setWheel(Wheel wheel) {  
           this.wheel = wheel;  
      }  
      public String getColor() {  
           return color;  
      }  
      public void setColor(String color) {  
           this.color = color;  
      }  
      @Override  
      public String toString() {  
           return "Car [wheel=" + wheel + ", color=" + color + "]";  
      }  
 }  

Next we need to create Wheel class as below.
 import javax.xml.bind.annotation.XmlType;  
 @XmlType  //indicates that this is one of the inner structures
 public class Wheel {  
      String manufacturer;  
      int cost;  
      public String getManufacturer() {  
           return manufacturer;  
      }  
      public void setManufacturer(String manufacturer) {  
           this.manufacturer = manufacturer;  
      }  
      public int getCost() {  
           return cost;  
      }  
      public void setCost(int cost) {  
           this.cost = cost;  
      }  
      @Override  
      public String toString() {  
           return "Wheel [manufacturer=" + manufacturer + ", cost=" + cost + "]";  
      }  
 }  

Next is the marshalling program.
 import java.io.FileOutputStream;  
 import java.io.IOException;  
 import javax.xml.bind.JAXBContext;  
 import javax.xml.bind.Marshaller;  
 import javax.xml.bind.JAXBException;  
 public class Marshall {  
      /**  
       * @param args  
       */  
      public static void main(String[] args) {  
           JAXBContext ctx;  
           try {  
                ctx = JAXBContext.newInstance(Car.class);  
                Marshaller m = ctx.createMarshaller();  
                m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
                // Marshal a Car object: 1st to stdout, 2nd to file  
                Wheel w = new Wheel();  
                w.setCost(1000);  
                w.setManufacturer("Michellin");  
                Car c = new Car();  
                c.setColor("Black");  
                c.setWheel(w);  
                m.marshal(c, System.out);  
                FileOutputStream out = new FileOutputStream("marshall.xml");  
                m.marshal(c, out);  
                out.close();  
           } catch (JAXBException | IOException e) {  
                e.printStackTrace();  
           }  
      }  
 }  

Run the application and you will see XML content is written to the console as well as in marshall.xml file in current working directory.


Now we will unmarshall the XML file into Java object. The below code performs JAXB unmarshalling.


 import java.io.File;  
 import javax.xml.bind.JAXBContext;  
 import javax.xml.bind.JAXBException;  
 import javax.xml.bind.Marshaller;  
 import javax.xml.bind.Unmarshaller;  
 public class UnMarshall {  
      /**  
       * @param args  
       */  
      public static void main(String[] args) {  
           JAXBContext ctx;  
           try {  
                ctx = JAXBContext.newInstance(Car.class);  
                Unmarshaller u = ctx.createUnmarshaller();  
                Car c = (Car) u.unmarshal(new File("marshall.xml"));  
                System.out.println("UnMarshalled Object:"+ c);  
                } catch (JAXBException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
           }  
      }  
 }  

When running the code it prints the Java object as below.

UnMarshalled Object:Car [wheel=Wheel [manufacturer=Michellin, cost=1000], color=Black]

Comments

Popular posts from this blog

How to format and install macOS in your old Macbook/ iMac

 You can follow these steps to install a mac OS on an old Mac book following these steps. Here I assume that you have the actual bootable CD for the OS for installation. 1. Restart the laptop 2. Press Command + R key until it shows recovery mode 3. Open Disk Utilities 4. Select the hard drive and try to partition the drive. For example I have created a partition called Partition1 5. Insert bootable CD and restart the laptop. When option comes choose to boot from the CD. 6. Choose partition1 as the place to install the OS 7. Continue the installation process. 8. Once installation is completed then it might need to restart for further updates. 9. Most of the times a more recent compatible version of the OS might be available. In order to upgrade to the more latest compatible OS follow below steps. 11. Find the latest compatible version of OS. 12. Go to apple support sites and manually download the image and click to install. 13. Follow installation instructions and this would upgrade you

How to create a minikube single node cluster for learning Kubernetes

In this post I will explain how to setup a minikube single node kubernetes cluster using AWS EC2 instance which would help anyone who is trying to learn kubernetes and also help them to gain practical knowledge in kubernetes by running kubernetes commands, creating kubernetes objects etc. Minikube is a single node kubernetes cluster which means a kubernetes cluster with only one node that is a single VM. Minikube is only used for learning purposes and it is not an alternative for a real kubernetes cluster and should not be used for development and production usage. In this example I have launched an AWS EC2 instance with below configuration where I will install minikube and related tools. AWS EC2 Instance Configuration AMI: Ubuntu Free tier eligible 64 bit Instance type : t2-large ( For me t2-small or t2-micro is giving performance issues due to less memory) Once the EC2 instance is up and running, login to the instance using below command on terminal. If you are using wi

log4j - How to write log to multiple log files using log4j.properties

In Java applications some times you may need to write your log messages to specific log files with its own specific log properties. If you are using log4j internally then first step that you need to do is to have a proper log4j.properties file. Below example shows 2 log4j appenders which write to 2 different log files, one is a debug log and another one is a reports log. Debug log file can have all log messages and reports log can have log messages specific to reporting on say splunk monitoring. # Root logger option log4j.rootLogger=ALL,STDOUT,debugLog log4j.logger.reportsLogger=INFO,reportsLog log4j.additivity.reportsLogger=false     log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout log4j.appender.STDOUT.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C:%L - %m%n     # Direct log messages to a log file log4j.appender.debugLog=org.apache.log4j.RollingFileAppender log4j.appender.debugLo