序列化和反序列化:
把对象转化为字节序列的过程称为序列化;
把字节序列恢复为对象的过程称为对象的反序列化;
方法:
Java.io.ObjectOutputStream代表对象的输出流,writeObject(Object obj)方法对参数对象进行序列化,把得到的字节序列写到一个目标输出流中。
Java.io.ObjectInputStream代表对象的输入流,readObject()方法可以从一个源输入流中读取字节序列,并转化为一个对象,将其返回。
只有实现Serializable和Externalizable接口的类的对象才能被序列化。
Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
对象序列化包括如下步骤:
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
2) 通过对象输出流的writeObject()方法写对象。
对象反序列化的步骤如下:
1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
2) 通过对象输入流的readObject()方法读取对象。
实例:
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.ObjectInputStream; 7 import java.io.ObjectOutputStream; 8 import java.io.Serializable; 9 import java.text.MessageFormat; 10 11 12 class Person implements Serializable{ 13 private int age; 14 public int getAge() { 15 return age; 16 } 17 public void setAge(int age) { 18 this.age = age; 19 } 20 public String getName() { 21 return name; 22 } 23 public void setName(String name) { 24 this.name = name; 25 } 26 private String name; 27 } 28 public class test { 29 public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException 30 { 31 SerialiablePerson(); 32 Person p=DeserializePerson(); 33 System.out.println(MessageFormat.format("name={0},age={1}",p.getName(),p.getAge())); 34 }
//反序列化的过程,从字节序列文件读出并返回 35 public static Person DeserializePerson() throws FileNotFoundException, IOException, ClassNotFoundException{ 36 ObjectInputStream in=new ObjectInputStream(new FileInputStream(new File("E://person.txt"))); 37 Person p=(Person)in.readObject(); 38 return p; 39 }
//序列化的过程,将字节存到E://Person.txt中 40 public static void SerialiablePerson() throws FileNotFoundException, IOException { 41 Person p=new Person(); 42 p.setAge(15); 43 p.setName("姓氏"); 44 45 ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(new File("E://Person.txt"))); 46 out.writeObject(p); 47 out.close(); 48 } 49 50 }