一 应用场景
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
在进行Java对象序列化的时候,会把其状态保存为一组字节,在对这些对象反序列化的时候再将这些字节组装成对象。但值得注意的事,对象序列化保存的是对象的”状态“,即它的成员变量,因此类中的静态变量不会被序列化。
二 实例演示
1 要使对象序列化需要实现Serialiable接口:(定义一个类如:Ser 实现Serialiable接口)
import java.io.Serializable;
public class Ser implements Serializable{
/**
private static final long serialVersionUID = -9177385581054040294L;
*/
public int age;
public String name;
public transient String sex;//通过加入transient关键字使得序列化对象时忽略掉该属性
}
2 编写测试类进行测试
import org.junit.Test;
import junit.framework.TestCase;
public class TestCompare extends TestCase {
//对象序列化
@Test
public void testSerializable() throws IOException{
Ser ser=new Ser();
ser.age=10;
ser.name="李四";
ser.sex="男";
FileOutputStream fo = null;
try {
fo=new FileOutputStream("D:/a.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("文件不存在");
e.printStackTrace();
}
ObjectOutputStream obj=new ObjectOutputStream(fo);
obj.writeObject(ser);
obj.close();
fo.close();
System.out.println("对象序列化完成");
}
//对象反序列化
@Test
public void testSerializable2() throws IOException, ClassNotFoundException{
FileInputStream file=new FileInputStream("D:/a.txt");
ObjectInputStream obj=new ObjectInputStream(file);
Ser ser=(Ser) obj.readObject();
System.out.println(ser.age+" "+ser.name+" "+ser.sex);
}
}
3 运行结果
在D盘下生成a.txt文件,是Ser对象的字节序列。通过反序列化可将该文件还原Ser对象状态。由于之前Ser对象的sex属性加了Transient关键字,因此序列化的时候忽略掉了该属性,导致反序列化的Ser对象的sex值为null
对象序列化完成
10 李四 null