java.beans包的XMLEncoder和XMLDecoder实现实体与xml转换

package j2se.core.base;
 
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
 
/**
 * Created by Lenovo on 2015/11/26.
 */
public class XMLUtil {
    /**
     * 读取由objSource指定的XML文件中的序列化保存的对象,返回的结果经过了List封装
     *
     * @param objSource
     *            带全部文件路径的文件全名
     * @return 由XML文件里面保存的对象构成的List列表(可能是一个或者多个的序列化保存的对象)
     * @throws java.io.FileNotFoundException
     *             指定的对象读取资源不存在
     * @throws java.io.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) {
        }
        fis.close();
        decoder.close();
        return objList;
    }
 
    /**
     * 保存一个集合到XML文件
     * @param objects
     * @param fileName
     * @throws IOException
     */
    public static void objectXmlEncoderList(List objects,String fileName) throws IOException {
        // 创建输出文件
        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文件
        for (Object obj : objects) {
            encoder.writeObject(obj);
        }
        encoder.flush();
        // 关闭序列化工具
        encoder.close();
        // 关闭输出流
        fos.close();
    }
 
    /**
     * 把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();
    }
}

测试:

package j2se.core.base;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * Created by Lenovo on 2015/11/26.
 */
public class XmlEncoderTest {
    public static void main(String[] args) {
        // 使用XMLEncoder将java序列化对象保存到XML文件
        String file = new String("d:/test/person.xml");
        List<Person> personList = new ArrayList<Person>(2);
        // 构造一个Person对象
        Person person = new Person();
        person.setId(100001);
        person.setName("张三");
        person.setPhoneNum("15825625152");
 
        // animal1
        Animal animal1 = new Animal();
        animal1.setId(1);
        animal1.setName("petter");
 
        // animal2
        Animal animal2 = new Animal();
        animal2.setId(2);
        animal2.setName("大黄");
 
        List<Animal> animals = new ArrayList<>(2);
        animals.add(animal1);
        animals.add(animal2);
        person.setAnimals(animals);
 
        // Person2
        Person person2 = new Person();
        person2.setId(100002);
        person2.setName("历史");
        person2.setPhoneNum("158525252551");
 
        List<Animal> animalList = new ArrayList<>(1);
        Animal animal = new Animal();
        animal.setId(3);
        animal.setName("果果");
        animalList.add(animal);
        person2.setAnimals(animalList);
        personList.add(person);
        personList.add(person2);
 
        try {
            XMLUtil.objectXmlEncoderList(personList, file);
            List<Person> persons = XMLUtil.objectXmlDecoder(file);
            for (Person p : persons) {
                System.out.println(p);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
}

生成的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_04" class="java.beans.XMLDecoder">
 <object class="j2se.core.base.Person">
  <void property="animals">
   <object class="java.util.ArrayList">
    <void method="add">
     <object class="j2se.core.base.Animal">
      <void property="id">
       <int>1</int>
      </void>
      <void property="name">
       <string>petter</string>
      </void>
     </object>
    </void>
    <void method="add">
     <object class="j2se.core.base.Animal">
      <void property="id">
       <int>2</int>
      </void>
      <void property="name">
       <string>大黄</string>
      </void>
     </object>
    </void>
   </object>
  </void>
  <void property="id">
   <int>100001</int>
  </void>
  <void property="name">
   <string>张三</string>
  </void>
  <void property="phoneNum">
   <string>15825625152</string>
  </void>
 </object>
 <object class="j2se.core.base.Person">
  <void property="animals">
   <object class="java.util.ArrayList">
    <void method="add">
     <object class="j2se.core.base.Animal">
      <void property="id">
       <int>3</int>
      </void>
      <void property="name">
       <string>果果</string>
      </void>
     </object>
    </void>
   </object>
  </void>
  <void property="id">
   <int>100002</int>
  </void>
  <void property="name">
   <string>历史</string>
  </void>
  <void property="phoneNum">
   <string>158525252551</string>
  </void>
 </object>
</java>
时间: 2024-09-30 03:31:37

java.beans包的XMLEncoder和XMLDecoder实现实体与xml转换的相关文章

JAVA的包

Java SE Platform 软件包 一.java基本包 13个1 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类. 2 java.awt 包含用于创建用户界面和绘制图形图像的所有类. java.awt.color 提供用于颜色空间的类. java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类. java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面

JDK源码简析--java.lang包中的基础类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下得rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 在本节中,简析java.lang包所包

1.java.io包中定义了多个流类型来实现输入和输出功能,

1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分 类,按功能分为:(C),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(G)   A.输入流和输出流 B.字节流和字符流 C.节点流和处理流   D.File stream E.Pipe stream F.Random stream G.Filter stream

java的包导入机制总结与剖析

java中有两种包的导入机制 总结如下: 1>>单类型导入(single-type-import),例如import java.io.File;   2>>按需类型导入(type-import-on-demand),例如 import java.io.*; 关于这两种导入类型大家各有所爱,众说纷纭.这里分析一下这两种导入类型的大致工作原理供大家参考. 单类型导入比较好理解,仅仅导入一个public类或者接口.而对于按需类型导入,有人误解为导入一个包下的所有类,其实不然,看名字就知道

Java io包中特殊的抽象类FilterReader和FilterWriter实践

刚才在看帮助文档的时候,发现Java io包中FilterReader和FilterWriter类没使用过,所以想实践一下. 还用以前的老方法,new一个出来,结果提示有错误: Cannot instantiate the type FilterReader 不能实例化? 一查帮助文档原来这样写道: public abstract class FilterReader extends Reader Abstract class for reading filtered character str

java中包命名常见规则

做java的都知道java的包.类.接口.枚举.方法.常量.变量等等模型都有一套约定的命名规则! 学习每一种语言都应该学习对应语法和命名规则,以保持一个良好的编码风格.一来显示自己的专业.二来方便阅读和检查,快速供其他人参考,尽快理解项目代码结构! 今天首先谈谈一些常用的java package命名规则,以后有时间再写写java其他的一些规范! 首先我们该知道的是,java的包名都是由小写单词组成的,类名的首字母都是大写,也就是我们常用的驼峰写法,包路径一般都是对系统模板的定义与归类.这样看了包

zoj 3714 Java Beans

#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<stack> #define mem(a,b) memset(a,b,sizeof(a)) #define ll __int64 #define MAXN 1000 #define INF

java中包容易出现的错误及权限问题

/* 3,权限在不同地方的体现: public protected default private 同一类中: ok ok ok ok 同一包中: ok ok ok 子类中: ok ok 不同包中: ok 在同一包中子类中是可以访问父类中默认权限(default)的方法,但是在不同包中不行! 在不同包中如果子类继承了父类,那么子类就可以访问父类中的protected方法! */ //import mytest.*; /* package mytest; public class DemoA{ p

转:java常用包

JAVA提供了强大的应用程序接口,既JAVA类库.他包含大量已经设计好的工具类,帮助程序员进行字符串处理.绘图.数学计算和网络应用等方面的工作.下面简单介绍JAVA核心类库中常用的组建包. 1.java.lang包 在所有的JAVA API类库中,JAVA.LANG包是最重要的,它提供了JAVA语言的核心类库,包含了运行JAVA程序必不可少的系统类,如:基本数据类型.基本数学函数.字符串处理.线程管理和异常处理类等.运行JAVA程序时,系统会自动加载JAVA.LANG包,既这个包的加载是默认的.