最近学习java序列化收获颇多。谈到序列化,不得不得说说为什么需要序列化?序列化的作用是把OOP编程中的对象转变为字节流然后存储到持久化的存储设备上。当从存储设备上读出这些序列化的消息并构建成对象这个过程称为反序列化。在面向对象的编程中,我们经常需要存储的不再是一些简单的变量,而是针对对象来存储。这在java的应用领域里实为常见。接下来我将谈谈java中序列化时怎么实现的。
首先,要序列化一个对象,必须实现java.io. Serializable接口,该接口中不含有任何方法,我觉得其作用是可以统一编程接口一次标识某个类可以序列化。在某些时候,我们也许并不想序列化所有的对象数据属性,我们可以采用关键字transient(表明对象为一个瞬时对象)声明,还可以把这些字段声明为static也不会被序列化。
其次,我们要从上知道了声明一个对象可以序列化,但究竟怎么去实现,我们可以这样去思考,由于我们是想把对象转变为字节流(序列化),以及从字节流转变为对象(反序列化),在java中必须实现writeObject和readObject方法,若该对象不覆盖这两个方法将会采用java默认的方法。在此以一个实例进行说明:
序列化一个对象:
package com.yx.serialization;
import java.io.Serializable;
publicclass SerializeStudent implements Serializable{
/**
* 序列化标识ID,用于在反序列化化时使用
* 反序列化的时候,如果内存中已经有了这个标识,则认为是同一类对象
*/
privatestaticfinallongserialVersionUID = 1L;
/*瞬时对象,不会被序列化*/
publictransient String m_nClass=null;
/*成员属性*/
private String m_StudentName=null;
public String m_Dept = null;
public void setStudentName(String name)
{
m_StudentName = name;
}
public void setDept(String dept)
{
m_Dept = dept;
}
public void setClass(String age)
{
m_nClass = age;
}
@Override
public String toString()
{
return"学生姓名:"+m_StudentName+",系 (静态字段):" +m_Dept+",班级:(瞬时字段):"
+m_nClass;
}
}
序列化测试以及反序列化
package com.yx.serialization;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
publicclass TestSerializable {
/**
* @param args
* @throws IOException
*/
publicstaticvoid main(String[] args) throws Exception {
// TODO Auto-generated method stub
/*序列化的文件路径*/
String filePath="E://seriable.out";
SerializeStudent Student = new SerializeStudent();
SerializeStudent nStudent = new SerializeStudent();
Student.setStudentName("Labixiaoxin");
Student.setDept("Computer Sicence");
Student.setClass("grade 1");
writeObjectTest(filePath,Student);
readObjectTest(filePath);
}
privatestaticvoid writeObjectTest(String filePath,Object obj) throws IOException
{
/*构造序列化流,也就是以流的形式写入文件*/
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(filePath);
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fos!=null)
{
fos.close();
}
if(oos!=null)
{
oos.close();
}
}
//清空静态字段,以免在后面反序列化时出现混淆
((SerializeStudent)obj).setDept(null);
}
privatestaticvoid readObjectTest(String filePath)
{
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(filePath);
ois = new ObjectInputStream(fis);
SerializeStudent obj = new SerializeStudent();
obj =(SerializeStudent) ois.readObject();
System.out.println("信息:"+obj);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结构:
信息:学生姓名:labixiaoxin,系(静态字段):null,班级:(瞬时字段):null
从输出结构我们可以看见,静态字段和瞬时字段为null,说明这两个字段并未序列化,也就是并未存入我们的磁盘中去。