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

谢谢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的更多相关文章

  1. 匿名对象序列化为XML

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  2. java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

    package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import ...

  3. 【C#】使用C#将类序列化为XML

    直接上代码: public static class XmlSerializer { public static void SaveToXml(string filePath, object sour ...

  4. C#实体类序列化为XML

    这两天,应要求做一个C/S的小程序,考虑到程序简洁小巧,存数据的方式不使用数据库,而是直接存入XML文档中保存.为了把复杂实体类里面的属性存入XML,我们可以使用C#有的反射机制,做一个简单的通用工具 ...

  5. asp.net webapi 序列化为xml 时实体属性增加<![CDATA[]]>防止特殊字符

    有时webapi在序列化xml时,可能需要给某些带有html或特殊字符(如 < > & /)的字段加上<![CDATA[]]> 已防止影响xml正常数据,如果使用.as ...

  6. ArcGIS Wpf MarkerSymbol 图形符号无法序列化为 JSON

    [问题贴,尚不知如何解决] 在GraphicsLayer中添加一个点,使用自定义模板渲染该点,在Vs2012设计界面可以看到,但运行时出现异常 代码如下: <esri:Graphic x:Nam ...

  7. Jquery 将表单序列化为Json对象

    大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法.不过,我们可以写一个插件实现. 我在网上看到有人用替换的方法,先用 ...

  8. Serializable 序列化为字符串 base64

    工具类 Base64.java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ja ...

  9. Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)

    Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...

随机推荐

  1. linux中将程序加入到开机自动启动

    如果将在linux中将命令或者程序设置为开机自动启动,只需要进入到将对应命令加入到/etc/rc.d/rc.local文件里即可,如下 打开文件,vi /etc/rc.d/rc.local #!/bi ...

  2. Linux系统手动安装rpm包依赖关系分析(以Kernel升级为例)

    有在Linux系统中安装软件的经历的人都知道,在Linux系统中手动安装软件不想在Windows下安装软件那么方便,直接双击,然后下一步下一步就可以把软件成功的装入到系统中,而在Linux系统中,安装 ...

  3. HUD1862:EXCEL排序

    Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能.   Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (< ...

  4. Entity Framework中对存储过程的返回值的处理

    很早就开始注意到EF了,但一直没有机会用,换了工作后,第一个项目就使用EF6进行开发. 项目不是很大,EF完全可以胜任. 但是开发过程中,难免还是会遇到一些复杂的运算,需要频繁访问数据库. 此时,想到 ...

  5. 网络请求 get post

    1.新建一个网络请求工具类,负责整个项目中所有的Http网络请求 提示:同步请求会卡住线程,发送网络请求应该使用异步请求(这意味着类方法不能有返回值) 2.工具类的实现 YYHttpTool.h文件 ...

  6. 使用SQLCMD在SQLServer执行多个脚本 转载

    出处不明 概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司 ...

  7. MySQL半同步复制的数据一致性探讨微信后台团队实践【转】

    MySQL是一个RDBMS(关系型数据库管理系统),由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.由于其体积小.速度快.拥有成本低,尤其是开放源码这一特点,广受各大企业欢迎,包括 ...

  8. js里写网页结构, 传函数参数

    如题 "<td align='center' height='30px' width='80px'><a href='javascript:sort(\"&quo ...

  9. Android自定义XML属性

    <?xml version="1.0" encoding="utf-8"?> <resources> <declare-style ...

  10. debug运行可以,release运行报错的原因及修改方法

    通常我们开发的程序有2种模式:Debug模式和Release模式在Debug模式下,编译器会记录很多调试信息,也可以加入很多测试代码,方便我们程序员测试,以及出现bug时的分析解决Release模式下 ...