序列化为XML
JXmlSerializable   是一个利用java反射,通过调用对象中所有以get(不区分大小写)开头的方法除去getClass方法,生成xml格式,希望与大家分享一下   
  下面是一个parent对象,包含两个child对象  生成的xml如下
Child类
 package xmlTest;
package xmlTest;
 import java.io.FileNotFoundException;
import java.io.FileNotFoundException; import java.io.IOException;
import java.io.IOException; import java.io.PrintWriter;
import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.InvocationTargetException; public class Child extends JXmlSerializable {
public class Child extends JXmlSerializable {
 private String _name;
 private String _name; private String _sex;
 private String _sex; private int age;
 private int age;
 public void setAge(int num) {
 public void setAge(int num) { age = num;
  age = num; }
 }
 public int getAge() {
 public int getAge() { return age;
  return age; }
 }
 public void setName(String name) {
 public void setName(String name) { _name = name;
  _name = name; }
 }
 public void setSex(String sex) {
 public void setSex(String sex) { _sex = sex;
  _sex = sex; }
 }
 public String getName() {
 public String getName() { return _name;
  return _name; }
 }
 public String getSex() {
 public String getSex() { return _sex;
  return _sex; }
 }
 }
}


Parent类
 package xmlTest;
package xmlTest;
 import java.io.PrintWriter;
import java.io.PrintWriter; import java.lang.reflect.Array;
import java.lang.reflect.Array; import java.util.*;
import java.util.*;
 public class Parent extends JXmlSerializable {
public class Parent extends JXmlSerializable {
 private String _name;
    private String _name; private String _sex;
    private String _sex; private LinkedList list = new LinkedList();
    private LinkedList list = new LinkedList(); private Vector vec = new Vector();
    private Vector vec = new Vector(); int age;
    int age;
 public void setAge(int num) {
    public void setAge(int num) { age = num;
        age = num; }
    }
 public int getAge() {
    public int getAge() { return age;
        return age; }
    }
 public void setName(String name) {
    public void setName(String name) { _name = name;
        _name = name; }
    }
 public void setSex(String sex) {
    public void setSex(String sex) { _sex = sex;
        _sex = sex; }
    }
 public String getName() {
    public String getName() { return _name;
        return _name; }
    }
 public String getSex() {
    public String getSex() { return _sex;
        return _sex; }
    }
 public void addChild(Child child) {
    public void addChild(Child child) { list.add(child);
        list.add(child); vec.add(child);
        vec.add(child); }
    }
 public Child[] getChild() {
    public Child[] getChild() {
 Child[] aa = new Child[vec.size()];
        Child[] aa = new Child[vec.size()]; // list.toArray(aa);
        // list.toArray(aa); vec.toArray(aa);
        vec.toArray(aa); return aa;
        return aa; }
    }
 public static void main(String[] args) {
    public static void main(String[] args) { // TODO Auto-generated method stub
        // TODO Auto-generated method stub try {
        try { Parent pat = new Parent();
            Parent pat = new Parent(); pat.setName("jack");
            pat.setName("jack"); pat.setSex("male");
            pat.setSex("male"); Child child1 = new Child();
            Child child1 = new Child(); child1.setName("tom");
            child1.setName("tom"); child1.setSex("male");
            child1.setSex("male"); pat.addChild(child1);
            pat.addChild(child1); Child child2 = new Child();
            Child child2 = new Child(); child2.setName("Marie");
            child2.setName("Marie"); child2.setSex("female");
            child2.setSex("female"); pat.addChild(child2);
            pat.addChild(child2); pat.getChild();
            pat.getChild(); PrintWriter out = new PrintWriter("abc.xml");
            PrintWriter out = new PrintWriter("abc.xml"); pat.toXmlSerial(out,0);
            pat.toXmlSerial(out,0); out.flush();
            out.flush();
 } catch (Exception e) {
        } catch (Exception e) { e.printStackTrace();
            e.printStackTrace(); }
        }
 }
    } }
}类 JXmlSerializable
 package xmlTest;
package xmlTest;
 import java.lang.reflect.Method;
import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Array;
import java.lang.reflect.Array; import java.io.PrintWriter;
import java.io.PrintWriter; import java.io.IOException;
import java.io.IOException; public class JXmlSerializable {
public class JXmlSerializable {
 public void toXmlSerial(PrintWriter out, int num)
    public void toXmlSerial(PrintWriter out, int num) throws InvocationTargetException, IllegalAccessException,
            throws InvocationTargetException, IllegalAccessException, IOException {
            IOException { out.write("<?xml version="1.0"?> ");
        out.write("<?xml version="1.0"?> "); String head = "";
        String head = ""; for (int i = 0; i < num; i++) {
        for (int i = 0; i < num; i++) { head += " ";
            head += " "; }
        } out.write(head + "<" + this.getClass().getName() + "> ");
        out.write(head + "<" + this.getClass().getName() + "> "); Method[] methods = this.getClass().getMethods();
        Method[] methods = this.getClass().getMethods(); for (int i = 0; i < methods.length; i++) {
        for (int i = 0; i < methods.length; i++) { Class[] paras = methods[i].getParameterTypes();
            Class[] paras = methods[i].getParameterTypes(); String name = methods[i].getName();
            String name = methods[i].getName(); if (paras == null || paras.length == 0) {
            if (paras == null || paras.length == 0) { if ((name.substring(0, 3).toLowerCase().equals("get"))
                if ((name.substring(0, 3).toLowerCase().equals("get")) && !name.equals("getClass")) {
                        && !name.equals("getClass")) { Object obj = methods[i].invoke(this, null);
                    Object obj = methods[i].invoke(this, null); getMethodXmlSerial(out, obj, methods[i], num);
                    getMethodXmlSerial(out, obj, methods[i], num); }
                } }
            } }
        }
 out.write(head + "</" + this.getClass().getName() + "> ");
        out.write(head + "</" + this.getClass().getName() + "> ");
 }
    }
 private void getMethodXmlSerial(PrintWriter out, Object obj, Method method,
    private void getMethodXmlSerial(PrintWriter out, Object obj, Method method, int num) throws InvocationTargetException, IllegalAccessException,
            int num) throws InvocationTargetException, IllegalAccessException, IOException {
            IOException { if (obj == null)
        if (obj == null) return;
            return; String head = "";
        String head = ""; for (int i = 0; i <= num; i++) {
        for (int i = 0; i <= num; i++) { head += " ";
            head += " "; }
        } if (obj.getClass().isArray()) {
        if (obj.getClass().isArray()) { for (int i = 0; i < Array.getLength(obj); i++) {
            for (int i = 0; i < Array.getLength(obj); i++) { Object childobj = Array.get(obj, i);
                Object childobj = Array.get(obj, i); if (childobj instanceof JXmlSerializable) {
                if (childobj instanceof JXmlSerializable) { ((JXmlSerializable) childobj).toXmlSerial(out, num + 1);
                    ((JXmlSerializable) childobj).toXmlSerial(out, num + 1); } else {
                } else { getMethodXmlSerial(out, childobj, method, num);
                    getMethodXmlSerial(out, childobj, method, num); }
                } }
            } } else {
        } else { out.write(head + "   <" + method.getName().substring(3) + ">   ");
            out.write(head + "   <" + method.getName().substring(3) + ">   "); out.write(obj.toString());
            out.write(obj.toString()); out.write("   </" + method.getName().substring(3) + ">    ");
            out.write("   </" + method.getName().substring(3) + ">    "); }
        }
 }
    } }
}编译出来还可以,能够达到我的理想。
编译结果是
 <?xml version="1.0"?>
<?xml version="1.0"?> <xmlTest.Parent>
<xmlTest.Parent> <Name>   jack   </Name>
       <Name>   jack   </Name>    <Age>   0   </Age>
       <Age>   0   </Age>    <Sex>   male   </Sex>
       <Sex>   male   </Sex>    <?xml version="1.0"?>
<?xml version="1.0"?> <xmlTest.Child>
    <xmlTest.Child> <Name>   tom   </Name>
           <Name>   tom   </Name>    <Age>   0   </Age>
           <Age>   0   </Age>    <Sex>   male   </Sex>
           <Sex>   male   </Sex>    </xmlTest.Child>
    </xmlTest.Child> <?xml version="1.0"?>
<?xml version="1.0"?> <xmlTest.Child>
    <xmlTest.Child> <Name>   Marie   </Name>
           <Name>   Marie   </Name>    <Age>   0   </Age>
           <Age>   0   </Age>    <Sex>   female   </Sex>
           <Sex>   female   </Sex>    </xmlTest.Child>
    </xmlTest.Child> </xmlTest.Parent>
</xmlTest.Parent>谢谢like199的分享。
今天看了看java.beans包,发现了两个好东西,XMLEncoder和XMLDecoder。发现自己以前把从XML存取对象真是太费力气啦。做了小工具类,以后可以用用了。
| 以下是引用片段: package com.imct.util; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * <title>使用XML文件存取可序列化的对象的类</title> * <description>提供保存和读取的方法</description> * @author 殷晋 * <copyright>清华大学汽车工程开发研究院@2005</copyright> * @version 1.0 * 2005-8-5 16:44:49 */ public class ObjectToXMLUtil { /** * 把java的可序列化的对象(实现Serializable接口)序列化保存到XML文件里面,如果想一次保存多个可序列化对象请用集合进行封装 * 保存时将会用现在的对象原来的XML文件内容 * @param obj 要序列化的可序列化的对象 * @param fileName 带完全的保存路径的文件名 * @throws FileNotFoundException 指定位置的文件不存在 * @throws IOException 输出时发生异常 * @throws Exception 其他运行时异常 */ public static void objectXmlEncoder(Object obj,String fileName) throws FileNotFoundException,IOException,Exception { //创建输出文件 File fo = new File(fileName); //文件不存在,就创建该文件 if(!fo.exists()) { //先创建文件的目录 String path = fileName.substring(0,fileName.lastIndexOf('.')); File pFile = new File(path); pFile.mkdirs(); } //创建文件输出流 FileOutputStream fos = new FileOutputStream(fo); //创建XML文件对象输出类实例 XMLEncoder encoder = new XMLEncoder(fos); //对象序列化输出到XML文件 encoder.writeObject(obj); encoder.flush(); //关闭序列化工具 encoder.close(); //关闭输出流 fos.close(); } /** * 读取由objSource指定的XML文件中的序列化保存的对象,返回的结果经过了List封装 * @param objSource 带全部文件路径的文件全名 * @return 由XML文件里面保存的对象构成的List列表(可能是一个或者多个的序列化保存的对象) * @throws FileNotFoundException 指定的对象读取资源不存在 * @throws IOException 读取发生错误 * @throws Exception 其他运行时异常发生 */ public static List objectXmlDecoder(String objSource) throws FileNotFoundException,IOException,Exception { List objList = new ArrayList(); File fin = new File(objSource); FileInputStream fis = new FileInputStream(fin); XMLDecoder decoder = new XMLDecoder(fis); Object obj = null; try { while( (obj = decoder.readObject()) != null) { objList.add(obj); } } catch (Exception e) { // TODO Auto-generated catch block } fis.close(); decoder.close(); return objList; } } | 
当然用Beans.instantiate也可以从文件中反序列化初对象
序列化为XML的更多相关文章
- 匿名对象序列化为XML
		using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ... 
- java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例
		package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import ... 
- 【C#】使用C#将类序列化为XML
		直接上代码: public static class XmlSerializer { public static void SaveToXml(string filePath, object sour ... 
- C#实体类序列化为XML
		这两天,应要求做一个C/S的小程序,考虑到程序简洁小巧,存数据的方式不使用数据库,而是直接存入XML文档中保存.为了把复杂实体类里面的属性存入XML,我们可以使用C#有的反射机制,做一个简单的通用工具 ... 
- asp.net webapi 序列化为xml 时实体属性增加<![CDATA[]]>防止特殊字符
		有时webapi在序列化xml时,可能需要给某些带有html或特殊字符(如 < > & /)的字段加上<![CDATA[]]> 已防止影响xml正常数据,如果使用.as ... 
- ArcGIS Wpf MarkerSymbol  图形符号无法序列化为 JSON
		[问题贴,尚不知如何解决] 在GraphicsLayer中添加一个点,使用自定义模板渲染该点,在Vs2012设计界面可以看到,但运行时出现异常 代码如下: <esri:Graphic x:Nam ... 
- Jquery 将表单序列化为Json对象
		大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法.不过,我们可以写一个插件实现. 我在网上看到有人用替换的方法,先用 ... 
- Serializable 序列化为字符串 base64
		工具类 Base64.java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ja ... 
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
		Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ... 
随机推荐
- linux配置java环境变量(转)
			linux配置java环境变量(详细) 一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586. ... 
- LeetCode OJ 141. Linked List Cycle
			Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ... 
- js调用函数的格式
			如题 onclick='alert(\""+""+"\")' onclick='alert(encodeURIComponen ... 
- Lvs+Keepalived+Bind+web构建高可用负载均衡系统
			原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://hatech.blog.51cto.com/8360868/1417899 --- ... 
- python http请求
			from httplib2 import Http def postDada(): http=Http() heads={"pragma":"no-cache" ... 
- MSSQL 字符串XML 合成列
			declare @str varchar(2000) set @str='1,2,3,4,6,8,5,9,10,11,12,13,14,15,16,17,18,19,20,29,30,31,32,33 ... 
- 笨方法学python--变量和命名
			1 =(单等号)和==(双等号)的区别 =用来赋值, ==用来判断是否相等 2 x = 100 在操作符2侧加空格,易读 3 打印时,进行字符串拼接 print "there are&quo ... 
- Batch Sort
			Batch Sort time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ... 
- Shell命令替换与变量替换
			命令替换 命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出.命令替换的语法: `command` 注意是反引号,不是单引号,这个键位于 Esc 键下方.下面的例子中,将命令执 ... 
- preg_replace  方法
			标红关键字 $text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. ... 
