一、序列化的作用
序列化定义:将对象转换为二进制数据流( 操作目标是对象)。
作用:方便传输及保存,可以帮开发者完成保存和读取对象成员变量取值的过程。 关键点: 1.一 个类若想被序列化,则要实现java.io.serializable接口,该接口中没有定义任何方法,是一个标识符(maker interface),当一个类实现了该接口,表示该类是可以被序列化的。 2.在序列化时,static变量是无法序列化的;如果A包含了一个对B的引用,当A序列化的时候也将B一并的序列化;如果A可以序列化,B不可以序列化,则A序列化的时候将会发生异常,将B的引用设为transient,该关键字表示变量不会被序列化,这样A就可以被序列化了。 static和transient关键字修饰的变量、引用不可以被序列化。 3.如果一个类可以被序列化,其子类也可以被序列化;因为子类也继承了serializable接口。 二、序列化使用方法
1.首先介绍两个用于序列化操作的类:ObjectlnputStream与ObjectOutputStream
(1)ObjectOutputStream(序列化)——将对象保存在文件之中
java.lang.Object java.io.OutputStream java.io.ObjectOutputStream
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
构造方法摘要 | |
|
为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。 |
创建写入指定 OutputStream 的 ObjectOutputStream。 |
(2)ObjectlnputStream(反序列化)——从文件读取已保存的对象
java.lang.Object java.io.InputStream java.io.ObjectInputStream
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
构造方法摘要 | |
|
为完全重新实现 ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。 |
创建从指定 InputStream 读取的 ObjectInputStream。 |
2.序列化使用的读写方法
writeObject
public final void writeObject(Object obj) throws IOException
将指定的对象写入 ObjectOutputStream
readObject
public final Object readObject()
throws IOException,
ClassNotFoundException
从 ObjectInputStream 读取对象
3.序列化步骤
(1)步骤1——对象实现Serializable
示例:
class Person
implements Serializable
{
private String name;
private int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}
(2)步骤2——使用ObjectOutputStream对对象进行序列化(序列化的内容是输出流)
public static void serialize(File f) throws Exception
{
OutputStream out = FileOutputStream(f);
ObjectOutputStream obj = new ObjectOutputStream(out); //把输出流out进行序列化
obj.writeObject(new Person("张三",30));
obj.close();
}
(3)步骤3——使用ObjectInputStream对对象进行反序列化(反序列化的内容是输入流)
public static void deserialize(File f) throws Exception
{
InputStream in = new FileInputStreanm(f);
ObjectInputStream obj = new ObjectInputStream(in);
Person p = (Person)obj.readObject();
System.out.println(p.toString());
}
4.程序完整示例
import java.io.*;
class Person implements Serializable
{
private String name;
private int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class PrintDemo
{
public static void main(String[] args) throws Exception
{
File f = new File("g:\\1.txt");
serialize(f);
deserialize(f);
}
public static void serialize(File f) throws Exception
{
OutputStream out = new FileOutputStream(f);
ObjectOutputStream obj = new ObjectOutputStream(out); //把输出流out进行序列化
obj.writeObject(new Person("张三",30));
obj.close();
}
public static void deserialize(File f) throws Exception
{
InputStream in = new FileInputStream(f);
ObjectInputStream obj = new ObjectInputStream(in);
Person p = (Person)obj.readObject();
System.out.println(p.toString());
}
}