对象序列化
1.序列化的含义和意义
(1)对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象;
(2)序列化机制允许将实现序列化的Java对象传换成字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象。序列化机制使得对象可以脱离程序运行而独立存在;
(3)对象的序列化(Serialize)指将一个Java对象写入IO流中,于此对应的是对象的反序列化(Deserialize)指从IO流中恢复该java对象;
(4)为了让某个Java对象实现可序列化,此Java对象必须实现以下接口之一:
1)Serializable
2)Externalizable
(5)Serializable接口是一个标记接口,实现该接口无须实现任何方法,只是表明该类是可序列化的;
(6)所有可能在网络上传播的对象类都应该是可序列化的,否则会引起异常;
(7)所有的分布式应用常常需要跨平台、跨网络,所以要求所有传递的参数、返回值必须实现序列化,通常建议:程序创建的每个JavaBean都要实现Serializable接口。
2.使用对象流实现序列化
(1)使用ObjectOutputStream序列化对象示例:
Person类:
import java.io.Serializable; //使用实现Serializable接口的方式使其可序列化 public class Person implements Serializable{ private String name; private int age; //此处未提供无参数构造器 public Person(String name,int age){ System.out.println("有参数的构造器"); this.name = name; this.age = age; } //setter、getter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
ObjectOutputStreamTest类:
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class ObjectOutputStreamTest { public static void main(String[] args) throws Exception { //创建一个ObjectOutputStream输出流 ObjectOutputStream os = null; try { os = new ObjectOutputStream(new FileOutputStream("object.txt")); Person p = new Person("test",18); //将p对象写入输出流 os.writeObject(p); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ os.close(); } } }
(2)使用ObjectInputStream反序列化对象示例:
使用上面序列化的程序,使用ObjectInputStreamTest反序列化
import java.io.FileInputStream; import java.io.ObjectInputStream; public class ObjectInputStreamTest { public static void main(String[] args) throws Exception{ //创建一个ObjectInputStream对象 ObjectInputStream in = null; try { in = new ObjectInputStream(new FileInputStream("object.txt")); //从输入流中读取一个JAVA对象,将其强制转换为Person对象 Person p = (Person)in.readObject(); System.out.println("该对象名字为:"+p.getName()+",该对象年龄为:"+p.getAge()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ in.close(); } } }
3.对象引用的序列化
4.自定义序列化
5.实现Externalizable接口的序列化
6.版本