Java对象的XML序列化与反序列化实例解析

上一篇文章我们介绍了java实现的各种排序算法代码示例,本文我们看看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序列化与反序列化实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java编程redisson实现分布式锁代码示例、Java编程ssh整合常见错误解析等,有什么问题可以随时留言,小编会及时回复大家的。下面推荐几本Java编程相关的书籍,供大家参考,免费下载哦:

写给大忙人看的Java核心技术 ([美]凯·S·霍斯特曼) 中文pdf扫描版

http://www.jb51.net/books/556994.html

java Vector类源代码与分析 WORD版

http://www.jb51.net/books/549902.html

希望大家能够喜欢,更多精彩内容尽在:http://www.jb51.net/

(0)

相关推荐

  • java实现XML增加元素操作简单示例

    本文实例讲述了java实现XML增加元素操作.分享给大家供大家参考,具体如下: package Day01; import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.*; public

  • java实现利用String类的简单方法读取xml文件中某个标签中的内容

    1.利用String类提供的indexOf()和substring()快速的获得某个文件中的特定内容 public static void main(String[] args) { // 测试某个词出现的位置 String reqMessage = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + "<in>" + "<head&g

  • JAVA通过XPath解析XML性能比较详解

    最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).D

  • java 与testng利用XML做数据源的数据驱动示例详解

    java 与testng利用XML做数据源的数据驱动示例详解 testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本.在这以XML为例: 备注:@DataProvider的返回值类型只能是Object[][]与Iterator<Object>[] TestData.xml: <?xml version="1.0" encoding="UTF-8"?> <

  • Java开发中读取XML与properties配置文件的方法

    相关阅读: 使用Ajax进行文件与其他参数的上传功能(java开发) 1. XML文件: 什么是XML?XML一般是指可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 2.XML文件的优点: 1)XML文档内容和结构完全分离. 2)互操作性强. 3)规范统一. 4)支持多种编码. 5)可扩展性强. 3.如何解析XML文档: XML在不同的语言中解析XML文档都是一样的,只不过实现的语法不一样,基本的解析方式有两种,一种是SAX方式,是按照XML文件的顺序一

  • Java对象的XML序列化与反序列化实例解析

    上一篇文章我们介绍了java实现的各种排序算法代码示例,本文我们看看Java对象的xml序列化与反序列化的相关内容,具体如下. XML是一种标准的数据交换规范,可以方便地用于在应用之间交换各类数据.如果能在Java对象和XML文档之间建立某种映射,例如Java对象的XML序列化和反序列化,那么就可以使Java的对象方便地与其他应用进行交换. java.beans包里面有两个类XMLEncoder和Decoder,分别用于将符合JabaBeans规范的Java对象以XML方式序列化和反序列化.以下

  • 深入分析XmlSerializer对象的Xml序列化与反序列化的示例详解

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间.为什么要做序列化和反序列化?.Net程序执行时,对象都驻留在内存中:内存中的对象如果需要传递给其他系统使用:或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化.范围:本文只介绍xml序列化,其实序列化可以是二进制的序列化,也可以是其他格式的序列化.看一段最简单的Xml序列化代码 复制代码 代码如下: class Program{    static void

  • .net实现序列化与反序列化实例解析

    序列化与反序列化是.net程序设计中常见的应用,本文即以实例展示了.net实现序列化与反序列化的方法.具体如下: 一般来说,.net中的序列化其实就是将一个对象的所有相关的数据保存为一个二进制文件(注意:是一个对象) 而且与这个对象相关的所有类型都必须是可序列化的所以要在相关类中加上 [Serializable]特性 对象类型包括:对象本身包含的类型,父类 拥有需要的对象之后: 1.将对象转换为二进制数据 使用专门的对像进行转换 BinaryFormatter 2.将二进制数据写入到文件 Fil

  • GSON实现Java对象的JSON序列化与反序列化的实例教程

    从GitHub下载GSON:https://github.com/google/gson Gson的应用主要为toJson与fromJson两个转换函数,而在使用这种对象转换之前需先创建好对象的类别以及其成员才能成功的将JSON字符串成功转换成相对应的对象. class Examples { private int answer1 = 100; private String answer2 = "Hello world!"; Examples(){ } // default const

  • java利用JAXB实现对象和xml互相转换方法与实例详解

    1.JAXB应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类 包含list(set同理).map.Teacher.Date 类型的属性 package jaxb; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAc

  • Java 序列化和反序列化实例详解

    Java 序列化和反序列化实例详解 在分布式应用中,对象只有经过序列化才能在各个分布式组件之间传输,这就涉及到两个方面的技术-发送者将对象序列化,接受者将对象反序列化,下面就是一个很好的例子! 1.实体-Employee import java.io.Serializable; public class Employee implements Serializable{ /** * */ private static final long serialVersionUID = 1L; publi

  • java对象序列化与反序列化原理解析

    这篇文章主要介绍了java对象序列化与反序列化原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.序列化和反序列化的概念 对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 二.序列化和反序列化的作用 对象的序列化主要有两种用途: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中. 在网络上传送对象的字节序列.网络上传输的都是二进制序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内

  • C#实现Xml序列化与反序列化的方法

    本文实例讲述了C#实现Xml序列化与反序列化的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /// <summary> /// Xml序列化与反序列化 /// </summary> public class XmlUtil { public static string GetRoot(string xml) {     XmlDocument doc = new XmlDocument();     doc.LoadXml(xml.Replace("

  • Java对象深复制与浅复制实例详解

     Java对象深复制与浅复制实例详解 我们在遇到一些业务场景的时候经常需要对对象进行复制,对于对象的复制一般有两种方式,深复制和浅复制 浅复制:对象的复制仅是对象本身,对象引用的其它对方并不会复制. 深复制:对象的复制包含对象引用的对象. Java所有对象的基类提供了clone方法,但是这个方法是protected native修饰,因此只暴露给之类去重写,外部是无法直接调用的. 我们现在来测试两种复制,首选是浅复制,浅复制要实现Cloneable接口. // 课程对象 class Class

  • .NET中XML序列化和反序列化常用类和属性小结

    目录 序列化和反序列化是指什么? XmlSerializer类 .NET-XML序列化和反序列化简单示例代码 XmlTypeAttribute类 应用示例 XmlElementAttribute类 应用示例 XmlAttributeAttribute类 应用示例 XmlArrayAttribute类 应用示例 XmlTextAttribute类 应用示例 XmlIgnoreAttribute类 应用示例 用来控制XML序列化的属性汇总 参考文章 序列化和反序列化是指什么? 序列化(seriall

随机推荐