XStream CDATA注解
2016-03-29 22:33
281 查看
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by GongXunyao on 15/12/28. */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface XStreamCDATA { }
import com.ins.car.common.officialapi.tianping2.utility.annotation.XStreamCDATA; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.core.util.QuickWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.naming.NameCoder; import com.thoughtworks.xstream.io.naming.NoNameCoder; import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import com.thoughtworks.xstream.io.xml.XppDomDriver; import java.io.Writer; import java.lang.reflect.Field; /** * Created by GongXunyao on 2015/12/29. */ /** * XStream工厂类 */ public class XStreamFactory { public static XStream getXStream() { final NameCoder nameCoder = new NoNameCoder (); XStream xStream = new XStream(new XppDomDriver (nameCoder) { @Override public HierarchicalStreamWriter createWriter(Writer out) { //输出格式化的xml字符串 return new PrettyPrintWriter (out, nameCoder) { //输出压缩的xml字符串,删除多余的空白符 //return new CompactWriter (out, nameCoder) { boolean cdata = false; Class<?> targetClass = null; @Override public void startNode(String name, Class clazz) { super.startNode(name, clazz); if(targetClass == null){ targetClass = clazz; } cdata = needCDATA(targetClass,name); } @Override protected void writeText(QuickWriter writer, String text) { if (cdata) { writer.write("<![CDATA["); writer.write(text); writer.write("]]>"); } else { writer.write(text); } } }; } }); return xStream; } private static boolean needCDATA(Class<?> targetClass, String fieldAlias){ boolean cdata = false; //first, scan self cdata = existsCDATA(targetClass, fieldAlias); if(cdata) return cdata; //if cdata is false, scan supperClass until java.lang.Object Class<?> superClass = targetClass.getSuperclass(); while(!superClass.equals(Object.class)){ cdata = existsCDATA(superClass, fieldAlias); if(cdata) return cdata; superClass = superClass.getSuperclass(); } return false; } private static boolean existsCDATA(Class<?> clazz, String fieldAlias){ //scan fields Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //1. exists XStreamCDATA if(field.getAnnotation(XStreamCDATA.class) != null ){ XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class); //2. exists XStreamAlias if(null != xStreamAlias){ if(fieldAlias.equals(xStreamAlias.value()))//matched return true; }else{// not exists XStreamAlias if(fieldAlias.equals(field.getName())) return true; } } } return false; } }
import com.ins.car.common.util.Encoding; import com.thoughtworks.xstream.XStream; /** * Created by GongXunyao on 2015/12/29. */ public class XStreamUtility { private static final XStream xStream = XStreamFactory.getXStream (); /** * Javabean 转XML * @param t 待转javabean对象 * @param <T> * @return xml字符串 */ public static <T> String toXml(T t, Encoding encoding){ String headLine = "<?xml version=\"1.0\" encoding=\""+ encoding.getEncoding () +"\"?>"; return headLine + xStream.toXML ( t ); } /** * XML字符串转javabean * @param xmlStr xml字符串 * @param <T> * @return Java对象 */ public static <T> T toJavaBean(String xmlStr){ return (T) xStream.fromXML ( xmlStr); } }
相关文章推荐
- Vsftp配置文件的设定值说明讲解
- Redis集群监控工具之RedisLive
- UVa 10152 - ShellSort
- C++错误输入的处理--整型错误输入字符串
- ZOJ2930 The Worst Schedule(最小割)
- 《Linux内核设计与实现》第18章读书笔记
- 判断两个单链表是否相交?若相交求交点
- 求方程所确定的隐函数y在 x=0处的导数
- R作图 图形设备不支持 tiff
- Android——selector背景选择器
- JavaScript 实现暴击事件
- 单复利软件单元测试
- 初次尝试利用脚本自动编译搭建LAMP-----php
- shell教程二: shell中的$
- C语言中的内存分配
- Linux学习路线规划
- eclipse下开发简单的Web Service
- java集合类特点总结
- 求两个数的最大公约数和最小公倍数
- oracle中的char、varchar、varchar2、nvarchar、nvarchar2区别