序列化为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的更多相关文章
- 匿名对象序列化为XML
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...
- java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例
package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import ...
- 【C#】使用C#将类序列化为XML
直接上代码: public static class XmlSerializer { public static void SaveToXml(string filePath, object sour ...
- C#实体类序列化为XML
这两天,应要求做一个C/S的小程序,考虑到程序简洁小巧,存数据的方式不使用数据库,而是直接存入XML文档中保存.为了把复杂实体类里面的属性存入XML,我们可以使用C#有的反射机制,做一个简单的通用工具 ...
- asp.net webapi 序列化为xml 时实体属性增加<![CDATA[]]>防止特殊字符
有时webapi在序列化xml时,可能需要给某些带有html或特殊字符(如 < > & /)的字段加上<![CDATA[]]> 已防止影响xml正常数据,如果使用.as ...
- ArcGIS Wpf MarkerSymbol 图形符号无法序列化为 JSON
[问题贴,尚不知如何解决] 在GraphicsLayer中添加一个点,使用自定义模板渲染该点,在Vs2012设计界面可以看到,但运行时出现异常 代码如下: <esri:Graphic x:Nam ...
- Jquery 将表单序列化为Json对象
大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法.不过,我们可以写一个插件实现. 我在网上看到有人用替换的方法,先用 ...
- Serializable 序列化为字符串 base64
工具类 Base64.java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ja ...
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...
随机推荐
- java常量和变量的定义规则,变长参数的使用
首先是定义的一般规则,类名首字母全部大写,常量全部大写用下划线分隔,变量用驼峰形式.注意使用long赋值用L时不能写小写的L要写大写的,不然会和数字“1”傻傻分不清. 下面是举例: public cl ...
- hdu_5680_zxa and set(想法题)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5680 题意: 问题描述 zxa有一个集合A=\{a_1,a_2,\cdots,a_n\}A={a1 ...
- 转载-SharePoint 2010 WebPart与Google地图系列 一:创建显示地图的WebPart
[原] SharePoint 2010 WebPart与Google地图系列 一:创建显示地图的WebPart 摘要: 作为信息化先驱的产品SharePoint 2010竟然对GIS相关技术支持如此有 ...
- Eclipse 安装 HDFS 插件
Eclipse 安装 hdfs 连接插件 1.插件安装 在$HADOOP_HOME/contrib/eclipse-plugin/文件夹中有个hadoop-eclipse-plugin-0.20.20 ...
- Shell脚本,自动化发布tomcat项目【转】
Shell脚本,自动化发布tomcat项目脚本. 1. vko2c_auto_build_by_scp.sh 文件内容: #---------------------start------------ ...
- css:cdata
javascript <![CDATA[的web标准使用方法 根据W3C XHTML 1.0的规定:在XHTML中,因为<和&这两个符号有特殊意义(小于号用于标签的开始标记), ...
- Linq分组,linq方法分组
Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: 01.public class ...
- awk 用法小结
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- apicloud教程2 (转载)
本帖最后由 中山赢友网络科技有限公司 于 2015-10-17 15:38 编辑 继<APICloud之小白图解教程系列(一):认识APICloud>之后的第二篇教程. 本篇教程有以下知识 ...
- OpenGL与vs编程——error C2440: “glMaterialfv”: 无法从“GLfloat”转换为“const GLfloat *”
void setMaterial(const GLfloat mat_diffuse[4],GLfloat mat_shininess){static const GLfloat mat_specul ...