一、序列化的作用

序列化定义:将对象转换为二进制数据流( 操作目标是对象)。

作用:方便传输及保存,可以帮开发者完成保存和读取对象成员变量取值的过程。 关键点: 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

构造方法摘要

protected

ObjectOutputStream() 

          为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。

ObjectOutputStream(OutputStream 

          创建写入指定 OutputStream 的 ObjectOutputStream。

(2)ObjectlnputStream(反序列化)——从文件读取已保存的对象

java.lang.Object java.io.InputStream java.io.ObjectInputStream

public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants

构造方法摘要

protected

ObjectInputStream()

          为完全重新实现

ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。

ObjectInputStream(InputStream

          创建从指定

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());
}
 }