首页 > 代码库 > Java序列化全面解析

Java序列化全面解析

序列化是将对象状态转换为可保持或可传输的格式过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。序列化为一般文件或字节流,也序列化为XML文件(使用XStream)。

假设被序列化的类为Student,定义如下:

package com.tds;

import java.io.Serializable;

public class Student implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Integer id;

	private String name;

	public Student(Integer id, String name) {
		this.id = id;
		this.name = name;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

序列化与反序列化的工具类如下:

package com.tds;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.thoughtworks.xstream.XStream;

/**
 * 序列化的工具类
 * @author Administrator
 *
 */
public class SerializableUtils {

	private static XStream xStream = new XStream();
	
	/**
	 * 把对象序列byte流
	 * @param obj
	 * @return
	 * @throws Exception 
	 */
	public static <T> byte[] objectToByte(T obj) throws Exception {
		
		if (obj == null) {
			return null;
		}
		ByteArrayOutputStream byteArrayOs = new ByteArrayOutputStream();
		ObjectOutputStream oOs = new ObjectOutputStream(byteArrayOs);
		oOs.writeObject(obj);
		return byteArrayOs.toByteArray();
	}
	
	/**
	 * 把对象从byte流中反序列化
	 * @param b
	 * @return
	 * @throws IOException 
	 */
	@SuppressWarnings("unchecked")
	public static <T> T byteToObject(byte[] b) throws Exception {
		
		if (b == null || b.length == 0) {
			return null;
		}
		ByteArrayInputStream byteArrayIs = new ByteArrayInputStream(b);
		ObjectInputStream oIs = new ObjectInputStream(byteArrayIs);
		return (T)oIs.readObject();
	}
	
	/**
	 * 把对象序列化为xml
	 * @param obj
	 * @return
	 */
	public static <T> String objectToXml(T obj) {
		
		return xStream.toXML(obj);
	}
	
	/**
	 * 把对象从xml反序更化为对象
	 * @param xml
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T xmlToObject(String xml) {
		
		return (T)xStream.fromXML(xml);
	}
}

在针对XStream序列化的时候,我们需要引入相关的jar包,下载地址如下:

http://xstream.codehaus.org/download.html ,添加相关的Jar包,即XStream.jar和xstream目标下所有jar包,当然有些jar包是多余的,相关的jar包如下:


测试类如下:

package com.tds;

public class Test {

	public static void main(String[] args) throws Exception {

		Student s1 = new Student(1, "张三");
		byte[] b1 = SerializableUtils.objectToByte(s1);

		Student s2 = SerializableUtils.byteToObject(b1);
		System.out.println("s2: " + s2.getId() + " " + s2.getName());

		String xml = SerializableUtils.objectToXml(s1);
		System.out.println(xml);

		Student s3 = SerializableUtils.xmlToObject(xml);
		System.out.println("s3: " + s3.getId() + " " + s3.getName());
	}
}
运行结果如下:

s2: 1 张三
<com.tds.Student>
  <id>1</id>
  <name>张三</name>
</com.tds.Student>
s3: 1 张三

说明序列化与反序列化均是成功的

补充一下,java的序列化对transient变量是不起作用的,这也是transient的作用,如果Student类的id字段修改为transient,即修改为:

private transient Integer id;
修改后的运行结果如下:

s2: null 张三
<com.tds.Student>
  <name>张三</name>
</com.tds.Student>
s3: null 张三

这是我们发现,id字段确实没有被序列化;





Java序列化全面解析