您的位置:首页 > 编程语言 > Java开发

JAXB将XML序列化为对象与将对象序列化为XML(日常记录)

2016-04-11 14:41 483 查看
<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[]{
4000
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>[code]entity.JAXBEntity@3d494fbf
]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java JAXB