天天看點

java xml序列化_java類序列化成xml 方法[轉]

今天看了下JAVA序列化。還是一知半解。怎麼也沒有弄明白,怎麼序列化成XML檔案。處入半解狀态。在網上找了很多,大部分是理論上的。沒有實際的例子。功夫不負有心人,終于找到了。做了下測試終于成功。忍不住記錄的下來。

JXmlSerializable   是一個利用java反射,通過調用對象中所有以get(不區分大小寫)開頭的方法除去getClass方法,生成xml格式,希望與大家分享一下

下面是一個parent對象,包含兩個child對象  生成的xml如下

Child類

java xml序列化_java類序列化成xml 方法[轉]

packagexmlTest;

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

importjava.io.FileNotFoundException;

java xml序列化_java類序列化成xml 方法[轉]

importjava.io.IOException;

java xml序列化_java類序列化成xml 方法[轉]

importjava.io.PrintWriter;

java xml序列化_java類序列化成xml 方法[轉]

importjava.lang.reflect.InvocationTargetException;

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicclassChildextendsJXmlSerializable...{

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

privateString _name;

java xml序列化_java類序列化成xml 方法[轉]

privateString _sex;

java xml序列化_java類序列化成xml 方法[轉]

privateintage;

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicvoidsetAge(intnum)...{

java xml序列化_java類序列化成xml 方法[轉]

  age=num;

java xml序列化_java類序列化成xml 方法[轉]

 }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicintgetAge()...{

java xml序列化_java類序列化成xml 方法[轉]

returnage;

java xml序列化_java類序列化成xml 方法[轉]

 }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicvoidsetName(String name)...{

java xml序列化_java類序列化成xml 方法[轉]

  _name=name;

java xml序列化_java類序列化成xml 方法[轉]

 }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicvoidsetSex(String sex)...{

java xml序列化_java類序列化成xml 方法[轉]

  _sex=sex;

java xml序列化_java類序列化成xml 方法[轉]

 }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicString getName()...{

java xml序列化_java類序列化成xml 方法[轉]

return_name;

java xml序列化_java類序列化成xml 方法[轉]

 }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicString getSex()...{

java xml序列化_java類序列化成xml 方法[轉]

return_sex;

java xml序列化_java類序列化成xml 方法[轉]

 }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

}

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

Parent類

java xml序列化_java類序列化成xml 方法[轉]

packagexmlTest;

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

importjava.io.PrintWriter;

java xml序列化_java類序列化成xml 方法[轉]

importjava.lang.reflect.Array;

java xml序列化_java類序列化成xml 方法[轉]

importjava.util.*;

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicclassParentextendsJXmlSerializable...{

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

privateString _name;

java xml序列化_java類序列化成xml 方法[轉]

privateString _sex;

java xml序列化_java類序列化成xml 方法[轉]

privateLinkedList list=newLinkedList();

java xml序列化_java類序列化成xml 方法[轉]

privateVector vec=newVector();

java xml序列化_java類序列化成xml 方法[轉]

intage;

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicvoidsetAge(intnum)...{

java xml序列化_java類序列化成xml 方法[轉]

        age=num;

java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicintgetAge()...{

java xml序列化_java類序列化成xml 方法[轉]

returnage;

java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicvoidsetName(String name)...{

java xml序列化_java類序列化成xml 方法[轉]

        _name=name;

java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicvoidsetSex(String sex)...{

java xml序列化_java類序列化成xml 方法[轉]

        _sex=sex;

java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicString getName()...{

java xml序列化_java類序列化成xml 方法[轉]

return_name;

java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicString getSex()...{

java xml序列化_java類序列化成xml 方法[轉]

return_sex;

java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicvoidaddChild(Child child)...{

java xml序列化_java類序列化成xml 方法[轉]

        list.add(child);

java xml序列化_java類序列化成xml 方法[轉]

        vec.add(child);

java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicChild[] getChild()...{

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

        Child[] aa=newChild[vec.size()];

java xml序列化_java類序列化成xml 方法[轉]

//list.toArray(aa);

java xml序列化_java類序列化成xml 方法[轉]

vec.toArray(aa);

java xml序列化_java類序列化成xml 方法[轉]

returnaa;

java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicstaticvoidmain(String[] args)...{

java xml序列化_java類序列化成xml 方法[轉]

//TODO Auto-generated method stub

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

try...{

java xml序列化_java類序列化成xml 方法[轉]

            Parent pat=newParent();

java xml序列化_java類序列化成xml 方法[轉]

            pat.setName("jack");

java xml序列化_java類序列化成xml 方法[轉]

            pat.setSex("male");

java xml序列化_java類序列化成xml 方法[轉]

            Child child1=newChild();

java xml序列化_java類序列化成xml 方法[轉]

            child1.setName("tom");

java xml序列化_java類序列化成xml 方法[轉]

            child1.setSex("male");

java xml序列化_java類序列化成xml 方法[轉]

            pat.addChild(child1);

java xml序列化_java類序列化成xml 方法[轉]

            Child child2=newChild();

java xml序列化_java類序列化成xml 方法[轉]

            child2.setName("Marie");

java xml序列化_java類序列化成xml 方法[轉]

            child2.setSex("female");

java xml序列化_java類序列化成xml 方法[轉]

            pat.addChild(child2);

java xml序列化_java類序列化成xml 方法[轉]

            pat.getChild();

java xml序列化_java類序列化成xml 方法[轉]

            PrintWriter out=newPrintWriter("abc.xml");

java xml序列化_java類序列化成xml 方法[轉]

            pat.toXmlSerial(out,0);

java xml序列化_java類序列化成xml 方法[轉]

            out.flush();

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

        }catch(Exception e)...{

java xml序列化_java類序列化成xml 方法[轉]

            e.printStackTrace();

java xml序列化_java類序列化成xml 方法[轉]

        }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]

}

類 JXmlSerializable

java xml序列化_java類序列化成xml 方法[轉]

packagexmlTest;

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

importjava.lang.reflect.Method;

java xml序列化_java類序列化成xml 方法[轉]

importjava.lang.reflect.InvocationTargetException;

java xml序列化_java類序列化成xml 方法[轉]

importjava.lang.reflect.Array;

java xml序列化_java類序列化成xml 方法[轉]

importjava.io.PrintWriter;

java xml序列化_java類序列化成xml 方法[轉]

importjava.io.IOException;

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicclassJXmlSerializable...{

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

publicvoidtoXmlSerial(PrintWriter out,intnum)

java xml序列化_java類序列化成xml 方法[轉]

throwsInvocationTargetException, IllegalAccessException,

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

            IOException...{

java xml序列化_java類序列化成xml 方法[轉]

        out.write("<?xml  version="1.0"?>");

java xml序列化_java類序列化成xml 方法[轉]

        String head="";

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

for(inti=0; i

java xml序列化_java類序列化成xml 方法[轉]

            head+="";

java xml序列化_java類序列化成xml 方法[轉]

        }

java xml序列化_java類序列化成xml 方法[轉]

        out.write(head+"");

java xml序列化_java類序列化成xml 方法[轉]

        Method[] methods=this.getClass().getMethods();

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

for(inti=0; i

java xml序列化_java類序列化成xml 方法[轉]

            Class[] paras=methods[i].getParameterTypes();

java xml序列化_java類序列化成xml 方法[轉]

            String name=methods[i].getName();

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

if(paras==null||paras.length==0)...{

java xml序列化_java類序列化成xml 方法[轉]

if((name.substring(0,3).toLowerCase().equals("get"))

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

&&!name.equals("getClass"))...{

java xml序列化_java類序列化成xml 方法[轉]

                    Object obj=methods[i].invoke(this,null);

java xml序列化_java類序列化成xml 方法[轉]

                    getMethodXmlSerial(out, obj, methods[i], num);

java xml序列化_java類序列化成xml 方法[轉]

                }

java xml序列化_java類序列化成xml 方法[轉]

            }

java xml序列化_java類序列化成xml 方法[轉]

        }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

        out.write(head+""+this.getClass().getName()+">");

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

privatevoidgetMethodXmlSerial(PrintWriter out, Object obj, Method method,

java xml序列化_java類序列化成xml 方法[轉]

intnum)throwsInvocationTargetException, IllegalAccessException,

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

            IOException...{

java xml序列化_java類序列化成xml 方法[轉]

if(obj==null)

java xml序列化_java類序列化成xml 方法[轉]

return;

java xml序列化_java類序列化成xml 方法[轉]

        String head="";

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

for(inti=0; i<=num; i++)...{

java xml序列化_java類序列化成xml 方法[轉]

            head+="";

java xml序列化_java類序列化成xml 方法[轉]

        }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

if(obj.getClass().isArray())...{

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

for(inti=0; i

java xml序列化_java類序列化成xml 方法[轉]

                Object childobj=Array.get(obj, i);

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

if(childobjinstanceofJXmlSerializable)...{

java xml序列化_java類序列化成xml 方法[轉]

                    ((JXmlSerializable) childobj).toXmlSerial(out, num+1);

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

                }else...{

java xml序列化_java類序列化成xml 方法[轉]

                    getMethodXmlSerial(out, childobj, method, num);

java xml序列化_java類序列化成xml 方法[轉]

                }

java xml序列化_java類序列化成xml 方法[轉]

            }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

        }else...{

java xml序列化_java類序列化成xml 方法[轉]

            out.write(head+"");

java xml序列化_java類序列化成xml 方法[轉]

            out.write(obj.toString());

java xml序列化_java類序列化成xml 方法[轉]

            out.write(""+method.getName().substring(3)+">");

java xml序列化_java類序列化成xml 方法[轉]

        }

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

    }

java xml序列化_java類序列化成xml 方法[轉]

}

編譯出來還可以,能夠達到我的理想。

編譯結果是

java xml序列化_java類序列化成xml 方法[轉]

<?xml  version="1.0"?>

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

jack

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

male

java xml序列化_java類序列化成xml 方法[轉]

<?xml  version="1.0"?>

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

tom

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

male

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

<?xml  version="1.0"?>

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

Marie

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

female

java xml序列化_java類序列化成xml 方法[轉]
java xml序列化_java類序列化成xml 方法[轉]

謝謝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也可以從檔案中反序列化初對象