XStream 注解处理xml
来源:互联网 发布:香港阿里云 淘宝 编辑:程序博客网 时间:2024/04/29 13:47
简介:XStream处理xml用得很普遍,特点是比较简单,干净,不是类型绑定的(相对于jaxb,xmlbeans...所以应用于webservice)以下介绍xstream注解处理xml的步骤:
1. 创建XStream
<span style="font-size:18px;"> XStream xstream = new XStream();</span>
2. xstream感知注解的类
当需要将对象序列化到xml的时候,这样做就可以很轻松的达到目的:
<span style="font-size:18px;">xstream.autodetectAnnotations(true);xstream.toXML(object);</span>但想将xml转换为对象的时候,按照上面的方式试试:
<span style="font-size:18px;">xstream.autodetectAnnotations(true);xstream.fromXML(new File(filepath));</span>问题来了,这样不行,原因是序列化的时候xstream能通过设置自动感知注解去序列化,反序列化的时候即便是设置了自动感知注解xstream也没有那么智能,那么我们就应该手动的让xstream先去处理注解了的类,步骤就应该是首先将注解的类全部找到,然后调方法让xstream去处理
2.1 加载指定包路径下的类(用spring的方法)
<span style="font-size:18px;">private static List<Class<?>> getClasses(String packagePath){//类的集合 List<Class<?>> classes = new ArrayList<Class<?>>(); String packageDirName = packagePath.replace('.', '/'); String resourcePattern = packageDirName + "/**/*.class";try {ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();// 通过模式匹配加载多个模式匹配的ResourceResource[] resources = resolver.getResources("classpath*:"+resourcePattern);for (Resource r : resources) {String fileRelativePath = r.getFile().getPath().replace(File.separator, "/");String className= fileRelativePath.substring(fileRelativePath.lastIndexOf(packageDirName), fileRelativePath.length()-6);try { //添加到classes classes.add(Class.forName(className.replace("/", "."))); }catch(ClassNotFoundException e){ e.printStackTrace(); }}} catch (IOException e) {e.printStackTrace();}return classes;}</span>如果没有用spring的包这样也可以:
<span style="font-size:18px;">//获取指定包下所有classpublic static List<Class<?>> findClassesByPk(String pk){String pkPath = pk.replace('.', '/');//MainClss.class.getClassLoader() 获取classLoader, MainClss为当前的类URL url = MainClss.class.getClassLoader().getResource(pkPath);File dir = new File(url.getFile()); List<Class<?>> clsList = new ArrayList<Class<?>>();if (!dir.exists() || !dir.isDirectory()) {return null;}File[] files = dir.listFiles();for(File file : files){if(file.isDirectory()){ String newpk =pk + "." + file.getName(); clsList.addAll(findClassesByPk(newpk));}else{int fileLen = file.getName().length();//如果是class文件if( fileLen > 6 && ".class".equals(file.getName().subSequence(fileLen - 6, fileLen))){String className = file.getName().substring(0,file.getName().length() - 6);Class<?> cls = null;try{ cls = Thread.currentThread().getContextClassLoader().loadClass(pk + '.' + className);}catch(ClassNotFoundException e){ e.fillInStackTrace();}clsList.add(cls);}}}return clsList;}</span>
2.2 手动调processAnnotations方法让xstream处理注解
<span style="font-size:18px;">public static void dealAnnotation(XStream xstream,List<Class<?>> clsList){for(Class<?> cls : clsList){if(cls.isAnnotationPresent(XStreamAlias.class)){xstream.processAnnotations(cls);continue;}Field[] fields = cls.getDeclaredFields();for(Field field : fields){if(field.isAnnotationPresent(XStreamAlias.class)){xstream.processAnnotations(cls);break;}}}}</span>
3. 序列化/反序列化
最后可以很轻松的调xstream.toXML(..)/xstream.fromXML(..)来序列化或者反序列化了
总结:当使用了xstream注解别名的时候,要使用xstream,首先得让xstream处理注解别名的类(找到注解别名的类,调processAnnotations方法),然后在进行序列化/反序列化。
0 0
- XStream 注解处理xml
- 使用XStream注解处理xml的属性及数据集合
- XML 处理利器 : XStream
- XML处理利器:XStream
- Xstream注解
- xstream 注解
- java 利用Xstream注解生成和解析xml
- 使用xStream 注解方式 对xml 文档的解析
- java 利用Xstream注解生成和解析xml
- Java 利用Xstream注解生成和解析xml
- XStream使用注解的方式格式化生成的xml
- XML:XStream
- XStream (二) -- Converter 接口 处理复杂一点的xml结构
- Xstream解析XML,包括对数组和List的处理
- XStream处理既有属性又有值的xml节点
- Spring OXM-XStream注解
- 利用Xstream注解实现xml和java bean之间的转换
- 使用XStream注解实现Java对象与XML互相转换的代码示例
- HTML5移动开发之路(10)——HTML5中的全局属性
- Android Launcher开发(五)添加应用程序桌面快捷方常见问题及解决方案
- C# md5加密方法
- 实验一:VC编程工具的灵活使用
- 杭电1575 Tr A(矩阵快速幂)
- XStream 注解处理xml
- 轻松搞定面试中的链表题目
- Wireshark基本介绍和学习TCP三次握手
- Linux上Apache服务的安装
- asp.net URL重新实例
- javascript中Math类的一些实用方法
- Hdu 1049
- Activity布局初步——06
- Math函数的引用