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
原创粉丝点击