JAXB將XML序列化爲對象與將對象序列化爲XML(日常記錄)

<pre name="code" class="java">不需要添加Jar所有Jar,JDK裏都有。

package util;

import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

/**
 * JAXB解析常用類
 * @ClassName JAXBParserUtil
 * @Description TODO(描述類作用)
 * @author Administrator
 * @data 2016年4月8日 下午3:31:43
 *
 */
public class JAXBParserUtil
{
	/**
	 * 把對象序列化爲XML
	 * 
	 * @Title serializaToXml
	 * @param obj
	 *            實例化對象
	 * @param clazz
	 *            對象Class
	 * @return
	 * @throws JAXBException
	 *             String
	 */
	public static String serializaToXml(Object obj, Class<?>[] clazz) throws JAXBException
	{
		return serializaToXml(obj, "UTF-8", clazz);
	}

	/**
	 * 把對象序列化爲XML
	 * 
	 * @Title serializaToXml
	 * @param obj
	 *            實例化對象
	 * @param encode
	 *            XML字符串編碼
	 * @param clazz
	 *            對象Class
	 * @return
	 * @throws JAXBException
	 *             String
	 */
	public static String serializaToXml(Object obj, String encode, Class<?>[] clazz) throws JAXBException
	{
		Set classes = new HashSet();
		if ((clazz != null) && (clazz.length > 0))
		{

			for (int i = 0; i < clazz.length; i++)
			{
				classes.add(clazz[i]);
			}
		}
		else
		{
			extractClasses(obj, classes);
		}
		JAXBContext context = JAXBContext.newInstance((Class[]) classes.toArray(new Class[classes.size()]));
		Marshaller marshaller = context.createMarshaller();
		marshaller.setProperty("jaxb.encoding", encode);
		marshaller.setProperty("jaxb.formatted.output", Boolean.valueOf(true));
		marshaller.setProperty("jaxb.fragment", Boolean.valueOf(false));
		StringWriter sw = new StringWriter();
		marshaller.marshal(obj, sw);
		return sw.toString();
	}

	/**
	 * 反序列化XML到對象
	 * 
	 * @Title unserializeFromXml
	 * @param reader
	 *            文件讀取類
	 * @param clazz
	 *            實例化對象類
	 * @return 實例化對象類
	 * @throws JAXBException
	 */
	public static Object unserializeFromXml(Reader reader, Class<?>[] clazz) throws JAXBException
	{
		JAXBContext context = JAXBContext.newInstance(clazz);
		Unmarshaller unmarshaller = context.createUnmarshaller();
		Object obj = unmarshaller.unmarshal(reader);
		return obj;
	}

	/**
	 * 反序列化XML到對象
	 * 
	 * @Title unserializeFromXml
	 * @param xml
	 *            xml文件
	 * @param clazz
	 *            實例化對象
	 * @return 實例化對象
	 * @throws JAXBException
	 */
	public static Object unserializeFromXml(String xml, Class<?>[] clazz) throws JAXBException
	{

		StringReader sr = new StringReader(xml);
		Object obj = unserializeFromXml(sr, clazz);
		return obj;
	}

	private static void extractClasses(Object obj, Set<Class<?>> classes)
	{
		Class clazz = obj.getClass();
		if (clazz.isInterface())
		{
			return;
		}
		XmlAccessorType annotation = (XmlAccessorType) clazz.getAnnotation(XmlAccessorType.class);
		if (annotation != null)
		{

			XmlAccessType value = annotation.value();
			if (XmlAccessType.PUBLIC_MEMBER.equals(value) || XmlAccessType.PROPERTY.equals(value))
			{

				Method[] declareMethods = clazz.getDeclaredMethods();
				for (Method method : declareMethods)
				{
					if (Modifier.isPublic(method.getModifiers()))
					{

						Class[] parameterType = method.getParameterTypes();
						if (parameterType.length != 0)
							continue;
						try
						{
							Object methodValue = method.invoke(obj, new Object[0]);
							if (methodValue != null)
							{
								extractCollectionClasses(methodValue, classes);
							}
						}
						catch (Exception e)
						{
							e.printStackTrace();
						}
					}
				}
			}
			else if (XmlAccessType.FIELD.equals(value))
			{
				Field[] declaredFields = clazz.getDeclaredFields();
				for (Field field : declaredFields)
				{
					field.setAccessible(true);
					try
					{
						Object propertyValue = field.get(obj);
						if (propertyValue != null)
						{
							extractCollectionClasses(propertyValue, classes);
						}
					}
					catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			}
		}
		extractCollectionClasses(obj, classes);
	}

	private static void extractCollectionClasses(Object obj, Set<Class<?>> classes)
	{

		try
		{
			if (obj instanceof Collection)
			{

				for (Iterator localIterator = ((Collection) obj).iterator(); localIterator.hasNext();)
				{
					Object item = localIterator.next();
					extractClasses(obj, classes);
				}
			}
			else if (obj instanceof Map)
			{

				Iterator keys = ((Map) obj).keySet().iterator();
				while (keys.hasNext())
				{
					Object key = keys.next();
					Object value = ((Map) obj).get(key);
					extractClasses(key, classes);
					extractClasses(value, classes);
				}
			}
			else
			{

				Class class1 = obj.getClass();
				if (class1.getName().contains("$$EnhancerByCGLIB$$"))
				{
					classes.add(class1.getSuperclass());
				}
				else if (!class1.isInterface())
					classes.add(class1);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

	}

}

實體1:

package entity;

import java.io.Serializable;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.apache.commons.lang.builder.ToStringBuilder;

@XmlRootElement(name="JAXBEntity")
public class JAXBEntity implements Serializable
{
	private static final long serialVersionUID = 1L;

	private String code;
	private String name;
	private List<JAXBEntity1> list;
	
	@XmlElement
	public String getCode()
	{
		return code;
	}
	public void setCode(String code)
	{
		this.code = code;
	}
	@XmlElement
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	@XmlElement(name = "JAXBEntity1")
	public List<JAXBEntity1> getList()
	{
		return list;
	}
	public void setList(List<JAXBEntity1> list)
	{
		this.list = list;
	}
	
	@Override
	public String toString()
	{
		return ToStringBuilder.reflectionToString(this);
	}
	
}
實體2:

package entity;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.apache.commons.lang.builder.ToStringBuilder;

@XmlRootElement(name="JAXBEntity1")
public class JAXBEntity1 implements Serializable
{
	private static final long serialVersionUID = 1L;
	
	private String sequence;
	private Integer styleId;
	private String elementName;
	private String entityField;
	
	@XmlElement
	public String getSequence()
	{
		return sequence;
	}
	public void setSequence(String sequence)
	{
		this.sequence = sequence;
	}
	@XmlElement
	public Integer getStyleId()
	{
		return styleId;
	}
	public void setStyleId(Integer styleId)
	{
		this.styleId = styleId;
	}
	@XmlElement
	public String getElementName()
	{
		return elementName;
	}
	public void setElementName(String elementName)
	{
		this.elementName = elementName;
	}
	@XmlElement
	public String getEntityField()
	{
		return entityField;
	}
	public void setEntityField(String entityField)
	{
		this.entityField = entityField;
	}
	
	@Override
	public String toString()
	{
		return ToStringBuilder.reflectionToString(this);
	}
}
測試方法:

class JAXBTest
{
	public static void main(String[] args)
	{
		try
		{
			JAXBEntity1 entity = new JAXBEntity1();
			entity.setElementName("elementName");
			entity.setEntityField("entityField");
			entity.setSequence("sequence");
			entity.setStyleId(111111);
			String xml = JAXBParserUtil.serializaToXml(entity, new Class[]{JAXBEntity1.class});
			
			System.out.println(xml);
			
			entity = (JAXBEntity1) JAXBParserUtil.unserializeFromXml(xml, new Class[]{JAXBEntity1.class});
			System.out.println(entity);
			
			System.out.println();
			
			JAXBEntity ent = new JAXBEntity();
			ent.setCode("code");
			ent.setName("name");
			List<JAXBEntity1> list = new ArrayList<JAXBEntity1>();
			JAXBEntity1 ent1 = new JAXBEntity1();
			ent1.setElementName("elementName");
			ent1.setEntityField("entityField");
			ent1.setSequence("sequence");
			ent1.setStyleId(111111);
			list.add(ent1);
			ent.setList(list);
			
			String xml1 = JAXBParserUtil.serializaToXml(ent, new Class[]{JAXBEntity.class,JAXBEntity1.class});
			
			System.out.println(xml1);
			
			ent = (JAXBEntity) JAXBParserUtil.unserializeFromXml(xml1, new Class[]{JAXBEntity.class,JAXBEntity1.class});
			
			System.out.println(ent);
		}
		catch (JAXBException e)
		{
			e.printStackTrace();
		}
		
	}
}
實體1測試環境:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<JAXBEntity1>
    <elementName>elementName</elementName>
    <entityField>entityField</entityField>
    <sequence>sequence</sequence>
    <styleId>111111</styleId>
</JAXBEntity1>
entity.JAXBEntity1@1d81eb93[sequence=sequence,styleId=111111,elementName=elementName,entityField=entityField]
實體2測試環境:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<JAXBEntity>
    <code>code</code>
    <JAXBEntity1>
        <elementName>elementName</elementName>
        <entityField>entityField</entityField>
        <sequence>sequence</sequence>
        <styleId>111111</styleId>
    </JAXBEntity1>
    <name>name</name>
</JAXBEntity>
entity.JAXBEntity@3d494fbf[code=code,name=name,list=[entity.JAXBEntity1@1ddc4ec2[sequence=sequence,styleId=111111,elementName=elementName,entityField=entityField]]]






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章