对象的序列化机制

允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,或者通过网络将这种二进制流传输到另一个网络节点,当其他程序获取到了这种二进制流,就可以恢复成原来的java对象。

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

只有实现了Serializable或者Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

  1. public class Cat extends Animal implements Serializable {
  2. //实现了接口还要写一个序列化版本号,随便写。不写自动生成,不写反序列容易出问题
  3. public static final long serialVersionUID=546556666l;
  4. @Override
  5. public void eat(){
  6. System.out.println("猫吃了东西");
  7. }
  8. public void sleep(){
  9. System.out.println("猫在猫床上睡觉");
  10. }
  11. }

序列化

  1. //将java内存中的对象保存到磁盘中或者通过网络传输
  2. try {
  3. ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream("D:\\1java\\aaa.dat"));
  4. oos.writeObject(new String("这是一段文字"));
  5. oos.flush();//刷新
  6. oos.close();
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }

反序列化

  1. //将磁盘中的对象数据反序列化到java对象中
  2. try {
  3. ObjectInputStream ooi =new ObjectInputStream(new FileInputStream("D:\\1java\\aaa.dat"));
  4. String o = (String)ooi.readObject();
  5. ooi.close();
  6. System.out.println(o);
  7. } catch (IOException | ClassNotFoundException e) {
  8. e.printStackTrace();
  9. }