标签:
Android中经常使用到操作XML,其中有一对XmlSerializer和XmlPullParser封装的很好,可是操作起来很复杂,虽然不难,但是感觉做了一点小事却写了一大堆的代码。有点烦,因此封装一下。
其思路为:根据传入的数据,获取字节码后进行反射解析,然后在存储。思路很简单,此demo只写了一个基本的List<T>类型的,其它类型道理与此大同小异,就当这个是抛砖引玉了。
对于一些Model可能有些字段是不需要序列化的,这里可以使用注解来操作
/** * XML操作工具类 * @author chenhao24 * */ public class XMLUtils{ /** * 持久化数据到本地xml * @param path * @param data * @throws Exception */ public static void serializerData(String path,List<?> data) throws Exception{ if(data == null || path == null || TextUtils.isEmpty(path) || data.isEmpty()){ return; } File destFile = new File(path); if(destFile.exists()){ destFile.delete(); destFile.createNewFile(); } Map<String, Method> mdatas = new HashMap<String, Method>(); String className = parseFields(data,mdatas); parseData(mdatas,data,destFile,className); } /** * 获取字节码并解析出字段和该字段对应的get方法 * @param data * @param mdatas * @return */ private static String parseFields(List<?> data,Map<String, Method> mdatas) { Class<?> clazz = data.get(0).getClass(); Field[] fields = clazz.getDeclaredFields(); Method[] methods = clazz.getMethods(); for (Field field : fields) { String fieldName = field.getName().toLowerCase(Locale.ENGLISH); for (Method method : methods) { //转小写 String methodName = method.getName().toLowerCase(Locale.ENGLISH); // 根据 field和get匹配 if (methodName.startsWith("get") && methodName.endsWith(fieldName)) { mdatas.put(fieldName, method); } else { continue; } } } // 获取 类名 String clazzName = clazz.getName(); return clazzName.substring(clazzName.lastIndexOf(".") + 1).toLowerCase(Locale.ENGLISH); } /** * 对数据进行解析并存储到xml中 * 这个方法写的不好,解析类和操作XML的代码混合在一起 * 而且还有个 双重循环。暂时先不处理 * @param mdatas * @param data * @param destFile * @param clazzName * @throws Exception */ private static void parseData(Map<String, Method> mdatas,List<?> data,File destFile,String clazzName) throws Exception{ // 此处进行存储 XmlSerializer xmlCreater = Xml.newSerializer(); FileOutputStream outputStream = new FileOutputStream(destFile); xmlCreater.setOutput(outputStream, StaticDatas.UTF8); xmlCreater.startDocument(StaticDatas.UTF8, true); // XML_ROOT 常量 写死 的 根节点 list xmlCreater.startTag(null, StaticDatas.XML_ROOT); for (Object mtmp : data) { // 此处开始循环创建 xmlCreater.startTag(null, clazzName); for (Iterator<Entry<String, Method>> iter = mdatas.entrySet().iterator(); iter.hasNext();) { Entry<String, Method> entry = iter.next(); String key = entry.getKey(); Method method = entry.getValue(); Object obj = method.invoke(mtmp, new Object[]{}); xmlCreater.startTag(null, key); xmlCreater.text(obj.toString()); xmlCreater.endTag(null, key); } // 循环创建结束 xmlCreater.endTag(null, clazzName); } xmlCreater.endTag(null, StaticDatas.XML_ROOT); xmlCreater.endDocument(); xmlCreater.flush(); if(outputStream != null){ outputStream.close(); } xmlCreater = null; } }
标签:
原文地址:http://www.cnblogs.com/cbooy/p/4965073.html