什么是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不一致,那么反序列化就失败了。 对象的输入输出流,主要的作用是用于写对象与读取对象的信息。对信息一旦写到文件上那么对象的信息就可以持久化了
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<Integer, Film> map = new HashMap<Integer, Film>(); 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<Integer, Film> m = new HashMap<Integer, Film>(); m = (Map<Integer, Film>) 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 + '}'; } } }
对象输入输出流要注意的细节
http://shenzhen.offcn.com/
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。