Serializable接口

什么是java序列化,如何实现?
   序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
   序列化是为了解决在对 对象进行读写操作时所引发的问题。
   序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要被实现的方法,implement Serializable只是为了标注该对象是可被序列化的,然后使用
         一个输出流(如:fileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject方法就可以
         将参数为obj的对象写出(即保存其状态),要恢复的话则利用输入流。
SerialVersionUID--下面简称SUID
其实序列化的作用是能转化成Byte流,然后又能反序列化成原始的类。能在网络进行传输,也可以保存在磁盘中,有了SUID之后,那么如果序列化的类已经保存了在本地中,中途你更改了类后,SUID变了,那么反序列化的时候就不会变成原始的类了,还会抛异常,主要就是用于版本控制。
SUID:IDE一般会帮你自动生成,其实这个值你可以自己设定,只要保证id值唯一就好。你可以理解成唯一标识。
serialVersionUID是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出来的。
使用ObjectInputStream 反序列化的时候,ObjectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。
对象的输入输出流,主要的作用是用于写对象与读取对象的信息。对信息一旦写到文件上那么对象的信息就可以持久化了
Serializable接口
package com.io.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.*;
import java.util.*;public class Test implements Serializable {//Serializable接口没有任何方法,只是一个标识接口
    public static void main(String[] args) throws Exception {        new Test().test();
    } 
    private void test() throws FileNotFoundException, IOException, ClassNotFoundException {
        Map map = new HashMap();
        map.put(1, new Film("变形金刚", 20));
        map.put(2, new Film("钢铁侠", 30));
        map.put(3, new Film("复仇者联盟", 40)); /*,序列化其实就是将film的相关信息转化为二进制存储在了map.txt这个文件中,那么用文本编辑器打开查看的话当然是会出现乱码的。只有通过反序列化才能将存储的二进制读取出来,然后正常显示在控制台上。*/
        ObjectOutputStream oos =  new ObjectOutputStream(new FileOutputStream("map.txt"));
        oos.writeObject(map);
        oos.close();         
     /*反序列化*/
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("map.txt"));
        Map m = new HashMap();
        m = (Map) ois.readObject();
        ois.close();
        System.out.println(m.toString());
    }    class Film implements Serializable {        //先执行序列化方法 唯一标识是1L  然后改成2L后   反序列化输出会报错
        private static final long serialVersionUID = 1L;        private String name;        private int duration; 
        public Film(String name, int duration) {            this.name = name;            this.duration = duration;
        }        public String getName() {            return name;
        }        public void setName(String name) {            this.name = name;
        }        public int getDuration() {            return duration;
        }        public void setDuration(int duration) {            this.duration = duration;
        }        public Film() {
        }
        @Override        public String toString() {            return "Film{" +                    "name='" + name + '\'' +                    ", duration=" + duration +                    '}';
        }
    }
}
Serializable接口

 

站在用户的角度思考问题,与客户深入沟通,找到萨嘎网站设计与萨嘎网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、网站建设、企业官网、英文网站、手机端网站、网站推广、域名与空间、网络空间、企业邮箱。业务覆盖萨嘎地区。

对象输入输出流要注意的细节

  1. 如果对象需要被写到文件上,那么对象所属的类必须实现Serializable接口,Serializable接口没有任何方法,只是一个标识接口。
  2. 对象的反序列化创建对象的时候并不会调用到构造方法的。
  3. serialVersionUID是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出来的。
  4. 使用ObjectInputStream 反序列化的时候,ObjectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。
  5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一个类制定了serialVersionUID,然后再序列化和反序列化的时候,jvm都不会再自己算这个serialVersionUID
  6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰
  7. 如果一个类维护了另外一个类的引用,那么另外一个类也需要实现Serializable接口
你们都是有经验的开发人员

http://shenzhen.offcn.com/


本文名称:Serializable接口
网站链接:http://myzitong.com/article/gpojeh.html