今天看了下JAVA序列化。還是一知半解。怎麼也沒有弄明白,怎麼序列化成XML檔案。處入半解狀态。在網上找了很多,大部分是理論上的。沒有實際的例子。功夫不負有心人,終于找到了。做了下測試終于成功。忍不住記錄的下來。
JXmlSerializable 是一個利用java反射,通過調用對象中所有以get(不區分大小寫)開頭的方法除去getClass方法,生成xml格式,希望與大家分享一下
下面是一個parent對象,包含兩個child對象 生成的xml如下
Child類
packagexmlTest;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.lang.reflect.InvocationTargetException;
publicclassChildextendsJXmlSerializable...{
privateString _name;
privateString _sex;
privateintage;
publicvoidsetAge(intnum)...{
age=num;
}
publicintgetAge()...{
returnage;
}
publicvoidsetName(String name)...{
_name=name;
}
publicvoidsetSex(String sex)...{
_sex=sex;
}
publicString getName()...{
return_name;
}
publicString getSex()...{
return_sex;
}
}
Parent類
packagexmlTest;
importjava.io.PrintWriter;
importjava.lang.reflect.Array;
importjava.util.*;
publicclassParentextendsJXmlSerializable...{
privateString _name;
privateString _sex;
privateLinkedList list=newLinkedList();
privateVector vec=newVector();
intage;
publicvoidsetAge(intnum)...{
age=num;
}
publicintgetAge()...{
returnage;
}
publicvoidsetName(String name)...{
_name=name;
}
publicvoidsetSex(String sex)...{
_sex=sex;
}
publicString getName()...{
return_name;
}
publicString getSex()...{
return_sex;
}
publicvoidaddChild(Child child)...{
list.add(child);
vec.add(child);
}
publicChild[] getChild()...{
Child[] aa=newChild[vec.size()];
//list.toArray(aa);
vec.toArray(aa);
returnaa;
}
publicstaticvoidmain(String[] args)...{
//TODO Auto-generated method stub
try...{
Parent pat=newParent();
pat.setName("jack");
pat.setSex("male");
Child child1=newChild();
child1.setName("tom");
child1.setSex("male");
pat.addChild(child1);
Child child2=newChild();
child2.setName("Marie");
child2.setSex("female");
pat.addChild(child2);
pat.getChild();
PrintWriter out=newPrintWriter("abc.xml");
pat.toXmlSerial(out,0);
out.flush();
}catch(Exception e)...{
e.printStackTrace();
}
}
}
類 JXmlSerializable
packagexmlTest;
importjava.lang.reflect.Method;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Array;
importjava.io.PrintWriter;
importjava.io.IOException;
publicclassJXmlSerializable...{
publicvoidtoXmlSerial(PrintWriter out,intnum)
throwsInvocationTargetException, IllegalAccessException,
IOException...{
out.write("<?xml version="1.0"?>");
String head="";
for(inti=0; i
head+="";
}
out.write(head+"");
Method[] methods=this.getClass().getMethods();
for(inti=0; 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()+">");
}
privatevoidgetMethodXmlSerial(PrintWriter out, Object obj, Method method,
intnum)throwsInvocationTargetException, IllegalAccessException,
IOException...{
if(obj==null)
return;
String head="";
for(inti=0; i<=num; i++)...{
head+="";
}
if(obj.getClass().isArray())...{
for(inti=0; i
Object childobj=Array.get(obj, i);
if(childobjinstanceofJXmlSerializable)...{
((JXmlSerializable) childobj).toXmlSerial(out, num+1);
}else...{
getMethodXmlSerial(out, childobj, method, num);
}
}
}else...{
out.write(head+"");
out.write(obj.toString());
out.write(""+method.getName().substring(3)+">");
}
}
}
編譯出來還可以,能夠達到我的理想。
編譯結果是
<?xml version="1.0"?>
jack
male
<?xml version="1.0"?>
tom
male
<?xml version="1.0"?>
Marie
female
謝謝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;
public class ObjectToXMLUtil
{
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();
}
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也可以從檔案中反序列化初對象