package inport; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import javax.xml.stream.util.StreamReaderDelegate; import javax.xml.transform.stream.StreamResult; /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * * @author topazh_ag */ public class SerializationHelper { public String serialize(Object object) throws Exception{ StringWriter resultWriter = new StringWriter(); StreamResult result = new StreamResult( resultWriter ); XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(result); JAXBContext context = JAXBContext.newInstance(object.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.marshal(new JAXBElement(new QName(object.getClass().getSimpleName()), object.getClass(), object), xmlStreamWriter); String res = resultWriter.toString(); return res; } public Object deserialize(String str, Class klass) throws Exception{ InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8")); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(is); reader = new CamelCaseTransfomingReaderDelegate(reader, klass); JAXBContext context = JAXBContext.newInstance(klass); Unmarshaller unmarshaller = context.createUnmarshaller(); JAXBElement elem = unmarshaller.unmarshal(reader, klass); Object object = elem.getValue(); return object; } //adapts to Java property naming style private static class CamelCaseTransfomingReaderDelegate extends StreamReaderDelegate { Class klass = null; public CamelCaseTransfomingReaderDelegate(XMLStreamReader xsr, Class klass) { super(xsr); this.klass = klass; } @Override public String getLocalName() { String nodeName = super.getLocalName(); if (!nodeName.equals(klass.getSimpleName())) { nodeName = nodeName.substring(0, 1).toLowerCase() + nodeName.substring(1, nodeName.length()); } return nodeName.intern(); //NOTE: intern very important!.. } } }