序列化是将对象状态转换为可保持或可传输的格式过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。序列化为一般文件或字节流,也序列化为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字段确实没有被序列化;