今天看了下JAVA序列化。还是一知半解。怎么也没有弄明白,怎么序列化成XML文件。处入半解状态。在网上找了很多,大部分是理论上的。没有实际的例子。功夫不负有心人,终于找到了。做了下测试终于成功。忍不住记录的下来。
JXmlSerializable 是一个利用java反射,通过调用对象中所有以get(不区分大小写)开头的方法除去getClass方法,生成xml格式,希望与大家分享一下
下面是一个parent对象,包含两个child对象 生成的xml如下
Child类
package
xmlTest;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
public class Child extends JXmlSerializable ... {
private String _name;
private String _sex;
private int age;
public void setAge(int num) ...{
age = num;
}
public int getAge() ...{
return age;
}
public void setName(String name) ...{
_name = name;
}
public void setSex(String sex) ...{
_sex = sex;
}
public String getName() ...{
return _name;
}
public String getSex() ...{
return _sex;
}
}
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
public class Child extends JXmlSerializable ... {
private String _name;
private String _sex;
private int age;
public void setAge(int num) ...{
age = num;
}
public int getAge() ...{
return age;
}
public void setName(String name) ...{
_name = name;
}
public void setSex(String sex) ...{
_sex = sex;
}
public String getName() ...{
return _name;
}
public String getSex() ...{
return _sex;
}
}
Parent类
package
xmlTest;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util. * ;
public class Parent extends JXmlSerializable ... {
private String _name;
private String _sex;
private LinkedList list = new LinkedList();
private Vector vec = new Vector();
int age;
public void setAge(int num) ...{
age = num;
}
public int getAge() ...{
return age;
}
public void setName(String name) ...{
_name = name;
}
public void setSex(String sex) ...{
_sex = sex;
}
public String getName() ...{
return _name;
}
public String getSex() ...{
return _sex;
}
public void addChild(Child child) ...{
list.add(child);
vec.add(child);
}
public Child[] getChild() ...{
Child[] aa = new Child[vec.size()];
// list.toArray(aa);
vec.toArray(aa);
return aa;
}
public static void main(String[] args) ...{
// TODO Auto-generated method stub
try ...{
Parent pat = new Parent();
pat.setName("jack");
pat.setSex("male");
Child child1 = new Child();
child1.setName("tom");
child1.setSex("male");
pat.addChild(child1);
Child child2 = new Child();
child2.setName("Marie");
child2.setSex("female");
pat.addChild(child2);
pat.getChild();
PrintWriter out = new PrintWriter("abc.xml");
pat.toXmlSerial(out,0);
out.flush();
} catch (Exception e) ...{
e.printStackTrace();
}
}
}
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util. * ;
public class Parent extends JXmlSerializable ... {
private String _name;
private String _sex;
private LinkedList list = new LinkedList();
private Vector vec = new Vector();
int age;
public void setAge(int num) ...{
age = num;
}
public int getAge() ...{
return age;
}
public void setName(String name) ...{
_name = name;
}
public void setSex(String sex) ...{
_sex = sex;
}
public String getName() ...{
return _name;
}
public String getSex() ...{
return _sex;
}
public void addChild(Child child) ...{
list.add(child);
vec.add(child);
}
public Child[] getChild() ...{
Child[] aa = new Child[vec.size()];
// list.toArray(aa);
vec.toArray(aa);
return aa;
}
public static void main(String[] args) ...{
// TODO Auto-generated method stub
try ...{
Parent pat = new Parent();
pat.setName("jack");
pat.setSex("male");
Child child1 = new Child();
child1.setName("tom");
child1.setSex("male");
pat.addChild(child1);
Child child2 = new Child();
child2.setName("Marie");
child2.setSex("female");
pat.addChild(child2);
pat.getChild();
PrintWriter out = new PrintWriter("abc.xml");
pat.toXmlSerial(out,0);
out.flush();
} catch (Exception e) ...{
e.printStackTrace();
}
}
}
类 JXmlSerializable
package
xmlTest;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Array;
import java.io.PrintWriter;
import java.io.IOException;
public class JXmlSerializable ... {
public void toXmlSerial(PrintWriter out, int num)
throws InvocationTargetException, IllegalAccessException,
IOException ...{
out.write("<?xml version="1.0"?> ");
String head = "";
for (int i = 0; i < num; i++) ...{
head += " ";
}
out.write(head + "<" + this.getClass().getName() + "> ");
Method[] methods = this.getClass().getMethods();
for (int i = 0; i < methods.length; i++) ...{
Class[] paras = methods[i].getParameterTypes();
String name = methods[i].getName();
if (paras == null || paras.length == 0) ...{
if ((name.substring(0, 3).toLowerCase().equals("get"))
&& !name.equals("getClass")) ...{
Object obj = methods[i].invoke(this, null);
getMethodXmlSerial(out, obj, methods[i], num);
}
}
}
out.write(head + "</" + this.getClass().getName() + "> ");
}
private void getMethodXmlSerial(PrintWriter out, Object obj, Method method,
int num) throws InvocationTargetException, IllegalAccessException,
IOException ...{
if (obj == null)
return;
String head = "";
for (int i = 0; i <= num; i++) ...{
head += " ";
}
if (obj.getClass().isArray()) ...{
for (int i = 0; i < Array.getLength(obj); i++) ...{
Object childobj = Array.get(obj, i);
if (childobj instanceof JXmlSerializable) ...{
((JXmlSerializable) childobj).toXmlSerial(out, num + 1);
} else ...{
getMethodXmlSerial(out, childobj, method, num);
}
}
} else ...{
out.write(head + " <" + method.getName().substring(3) + "> ");
out.write(obj.toString());
out.write(" </" + method.getName().substring(3) + "> ");
}
}
}
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Array;
import java.io.PrintWriter;
import java.io.IOException;
public class JXmlSerializable ... {
public void toXmlSerial(PrintWriter out, int num)
throws InvocationTargetException, IllegalAccessException,
IOException ...{
out.write("<?xml version="1.0"?> ");
String head = "";
for (int i = 0; i < num; i++) ...{
head += " ";
}
out.write(head + "<" + this.getClass().getName() + "> ");
Method[] methods = this.getClass().getMethods();
for (int i = 0; i < methods.length; i++) ...{
Class[] paras = methods[i].getParameterTypes();
String name = methods[i].getName();
if (paras == null || paras.length == 0) ...{
if ((name.substring(0, 3).toLowerCase().equals("get"))
&& !name.equals("getClass")) ...{
Object obj = methods[i].invoke(this, null);
getMethodXmlSerial(out, obj, methods[i], num);
}
}
}
out.write(head + "</" + this.getClass().getName() + "> ");
}
private void getMethodXmlSerial(PrintWriter out, Object obj, Method method,
int num) throws InvocationTargetException, IllegalAccessException,
IOException ...{
if (obj == null)
return;
String head = "";
for (int i = 0; i <= num; i++) ...{
head += " ";
}
if (obj.getClass().isArray()) ...{
for (int i = 0; i < Array.getLength(obj); i++) ...{
Object childobj = Array.get(obj, i);
if (childobj instanceof JXmlSerializable) ...{
((JXmlSerializable) childobj).toXmlSerial(out, num + 1);
} else ...{
getMethodXmlSerial(out, childobj, method, num);
}
}
} else ...{
out.write(head + " <" + method.getName().substring(3) + "> ");
out.write(obj.toString());
out.write(" </" + method.getName().substring(3) + "> ");
}
}
}
编译出来还可以,能够达到我的理想。
编译结果是
<?
xml version="1.0"
?>
< xmlTest .Parent >
< Name > jack </ Name >
< Age > 0 </ Age >
< Sex > male </ Sex >
<? xml version="1.0" ?>
< xmlTest .Child >
< Name > tom </ Name >
< Age > 0 </ Age >
< Sex > male </ Sex >
</ xmlTest.Child >
<? xml version="1.0" ?>
< xmlTest .Child >
< Name > Marie </ Name >
< Age > 0 </ Age >
< Sex > female </ Sex >
</ xmlTest.Child >
</ xmlTest.Parent >
< xmlTest .Parent >
< Name > jack </ Name >
< Age > 0 </ Age >
< Sex > male </ Sex >
<? xml version="1.0" ?>
< xmlTest .Child >
< Name > tom </ Name >
< Age > 0 </ Age >
< Sex > male </ Sex >
</ xmlTest.Child >
<? xml version="1.0" ?>
< xmlTest .Child >
< Name > Marie </ Name >
< Age > 0 </ Age >
< Sex > female </ Sex >
</ xmlTest.Child >
</ xmlTest.Parent >
谢谢like199的分享。