>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 28752 个阅读者 刷新本主题
 * 贴子主题:  Java对象的XML序列化与反序列化实例解析 回复文章 点赞(0)  收藏  
作者:日月光华    发表时间:2019-10-13 21:20:26     消息  查看  搜索  好友  邮件  复制  引用


这篇文章主要介绍了Java对象的XML序列化与反序列化实例解析,小编觉得还是挺不错的,这里分享给大家。

本文我们看看Java对象的xml序列化与反序列化的相关内容,具体如下。

XML是一种标准的数据交换规范,可以方便地用于在应用之间交换各类数据。如果能在Java对象和XML文档之间建立某种映射,例如Java对象的XML序列化和反序列化,那么就可以使Java的对象方便地与其他应用进行交换。

java.beans包里面有两个类XMLEncoder和Decoder,分别用于将符合JabaBeans规范的Java对象以XML方式序列化和反序列化。以下代码显示了如何使用这两个类实现Java对象的XML编码和解码。
待序列化的Java类:
import java.io.Serializable;
public class SerialableObject implements Serializable
{
    private static final long serialVersionUID = 8745578444312339136L;
    public SerialableObject()
      {
    }
    public SerialableObject(int id, String name, double value)
      {
        this.id = id;
        this.name = name;
        this.value = value;
    }
    public int getId()
      {
        return id;
    }
    public void setId(int id)
      {
        this.id = id;
    }
    public String getName()
      {
        return name;
    }
    public void setName(String name)
      {
        this.name = name;
    }
    public double getValue()
      {
        return value;
    }
    public void setValue(double value)
      {
        this.value = value;
    }
    private int id;
    private String name;
    private double value;
}

XML序列化和反序列化用法演示类:


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.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Vector;
public class XmlSerialize
{
    public XmlSerialize()
      {
    }
    public void serializeSingleObject(OutputStream os, Object obj)    // 序列化单个java对象
    {
        // XMLEncoder xe = new XMLEncoder(os);
        XMLEncoder xe = new XMLEncoder(os, "GBK", true, 0);
        // 仅用于Java SE 7
        xe.writeObject(obj);
        // 序列化成XML字符串
        xe.close();
    }
    public Object deserializeSingleObject(InputStream is)    // 反序列化单个Java对象
    {
        XMLDecoder xd = new XMLDecoder(is);
        Object obj = xd.readObject();
        // 从XML序列中解码为Java对象
        xd.close();
        return obj;
    }
    public void serializeMultipleObject(OutputStream os, List<Object> objs)    // 序列化多个Java对象
    {
        XMLEncoder xe = new XMLEncoder(os);
        xe.writeObject(objs);
        // 序列化成XML字符串
        xe.close();
    }
    public List<Object> deserializeMultipleObject(InputStream is)    // 反序列化多个Java对象
    {
        XMLDecoder xd = new XMLDecoder(is);
        @SuppressWarnings("unchecked")
           List<Object> objs = (List<Object>)xd.readObject();
        // 从XML序列中解码为Java对象列表
        xd.close();
        return objs;
    }
    public void runSingleObject()
      {
        File xmlFile = new File("object.xml");
        SerialableObject jo4Out = new SerialableObject(1, "Java序列化为XML", 3.14159265359);
        // 创建待序列化的对象
        try
           {
            FileOutputStream ofs = new FileOutputStream(xmlFile);
            // 创建文件输出流对象
            serializeSingleObject(ofs, jo4Out);
            ofs.close();
        }
        catch (FileNotFoundException e)
           {
            e.printStackTrace();
        }
        catch (IOException e)
           {
            e.printStackTrace();
        }
        try
           {
            FileInputStream ifs = new FileInputStream(xmlFile);
            SerialableObject jo4In = (SerialableObject)deserializeSingleObject(ifs);
            System.out.println("id: " + jo4In.getId());
            System.out.println("name: " + jo4In.getName());
            System.out.println("value: " + jo4In.getValue());
        }
        catch (FileNotFoundException e)
           {
            e.printStackTrace();
        }
    }
    public void runMultipleObject()
      {
        File xmlFile = new File("objects.xml");
        List<SerialableObject> sos4Out = new Vector<SerialableObject>();
        sos4Out.add(new SerialableObject(1, "Java序列化为XML - 1", 3.14));
        // 创建待序列化的对象
        sos4Out.add(new SerialableObject(2, "Java序列化为XML - 2", 3.14159));
        // 创建待序列化的对象
        sos4Out.add(new SerialableObject(3, "Java序列化为XML - 3", 3.1415926));
        // 创建待序列化的对象
        sos4Out.add(new SerialableObject(4, "Java序列化为XML - 4", 3.141592653));
        // 创建待序列化的对象
        sos4Out.add(new SerialableObject(5, "Java序列化为XML - 5", 3.14159265359));
        // 创建待序列化的对象
        try
           {
            FileOutputStream ofs = new FileOutputStream(xmlFile);
            // 创建文件输出流对象
            serializeSingleObject(ofs, sos4Out);
            ofs.close();
        }
        catch (FileNotFoundException e)
           {
            e.printStackTrace();
        }
        catch (IOException e)
           {
            e.printStackTrace();
        }
        try
           {
            FileInputStream ifs = new FileInputStream(xmlFile);
            @SuppressWarnings("unchecked")
                 List<SerialableObject> sos4In = (List<SerialableObject>)deserializeSingleObject(ifs);
            for (SerialableObject jo4In : sos4In)
                 {
                System.out.println("id: " + jo4In.getId());
                System.out.println("name: " + jo4In.getName());
                System.out.println("value: " + jo4In.getValue());
            }
        }
        catch (FileNotFoundException e)
           {
            e.printStackTrace();
        }
    }
    public static void main(String[] args)
      {
        XmlSerialize xs = new XmlSerialize();
        xs.runSingleObject();
        xs.runMultipleObject();
    }
}

需要注意的是,待序列化的类必须要符合JavaBeans的格式规范,即:具有一个无参的public构造函数,所有数据成员的访问均采用getter/setter模式,此外,这个类必须是public的,并且实现了java.io.Serializable接口。

程序运行之后,会产生两个文件:

object.xml是runSingleObject方法生成的,存放了单个的SerialableObject的值:


<?xml version="1.0" encoding="GBK"?>
<java version="1.7.0" class="java.beans.XMLDecoder">
<object class="SerialableObject">
<void property="id">
  <int>1</int>
</void>
<void property="name">
  <string>Java序列化为XML</string>
</void>
<void property="value">
  <double>3.14159265359</double>
</void>
</object>
</java>

objects.xml是runMultipleObject方法产生的,存放了5个SerializableObject的值:


<?xml version="1.0" encoding="GBK"?>
<java version="1.7.0" class="java.beans.XMLDecoder">
<object class="java.util.Vector">
<void method="add">
  <object class="SerialableObject">
  <void property="id">
   <int>1</int>
  </void>
  <void property="name">
   <string>Java序列化为XML - 1</string>
  </void>
  <void property="value">
   <double>3.14</double>
  </void>
  </object>
</void>
<void method="add">
  <object class="SerialableObject">
  <void property="id">
   <int>2</int>
  </void>
  <void property="name">
   <string>Java序列化为XML - 2</string>
  </void>
  <void property="value">
   <double>3.14159</double>
  </void>
  </object>
</void>
<void method="add">
  <object class="SerialableObject">
  <void property="id">
   <int>3</int>
  </void>
  <void property="name">
   <string>Java序列化为XML - 3</string>
  </void>
  <void property="value">
   <double>3.1415926</double>
  </void>
  </object>
</void>
<void method="add">
  <object class="SerialableObject">
  <void property="id">
   <int>4</int>
  </void>
  <void property="name">
   <string>Java序列化为XML - 4</string>
  </void>
  <void property="value">
   <double>3.141592653</double>
  </void>
  </object>
</void>
<void method="add">
  <object class="SerialableObject">
  <void property="id">
   <int>5</int>
  </void>
  <void property="name">
   <string>Java序列化为XML - 5</string>
  </void>
  <void property="value">
   <double>3.14159265359</double>
  </void>
  </object>
</void>
</object>
</java>

总结
以上就是本文关于Java对象的XML序列化与反序列化实例解析的全部内容,希望对大家有所帮助。


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->第一个Java程序
  JavaWeb开发-->JSP中使用JavaBean(Ⅱ)
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->基于MVC和RMI的分布式应用
  精通Spring-->绑定表单
  Vue3开发-->Vue简介
  BIO、NIO和AIO的区别、三种IO的原理与用法
  深入Java单例模式
  18 张图弄懂面试官必问的一致性哈希
  用注解去代替if-else的技巧
  BST 二叉搜索树
  64匹马,8个赛道,找出跑得最快的4匹马
  最实用的10个重构小技巧排行榜,你都用过哪些?
  volatile 实现原理
  java常见的几种调用机制:同步调用,异步调用,回调
  volatile 与 synchronized 详解
  Eclipse使用指南:Debug 配置
  正则表达式基础入门
  Java入门实用代码:打印矩形
  【Java 并发笔记】CountDownLatch 相关整理
  Java性能优化总结
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。