java类序列化成xml 方法

      今天看了下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;
 }


}



 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();
        }


    }

}

类 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(03).toLowerCase().equals("get"))
                        
&& !name.equals("getClass")) {
                    Object obj 
= methods[i].invoke(thisnull);
                    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 >

 

 谢谢like199的分享。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值