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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树