序列化与反序列化

来源:互联网 发布:手机cms 编辑:程序博客网 时间:2024/06/06 20:32

话不多说,直接开工

1.我们有一个User类,实现了Serializable接口

public class User implements Serializable {    private static final long serialVersionUID = -1L;    public int id;    public String name;    public String info;    public User() {    }    public User(int id, String name,String info) {        this.id = id;        this.name = name;        this.info = info;    }//getset方法省略    @Override    public String toString() {        return "id="+id+"\nname="+name+"\ninfo="+info;    }}

2.开始序列化也就是将user对象写入文件中,直接贴代码

public static void main(String[] args) throws Exception {    String path = "D:\\a.txt";    User user = new User(1,"张三123","info");    ObjectOutput out = new ObjectOutputStream(new FileOutputStream(path));    out.writeObject(user);    out.close();}
3.反序列化

public static void main(String[] args) throws Exception {    String path = "D:\\a.txt";    ObjectInputStream in = null;    in = new ObjectInputStream(new FileInputStream(path));    User user = (User) in.readObject();    in.close();    System.out.print(user.toString());}
结果:成功读取


接着,说说关于serialVersionUID的问题

为什么要有serialVersionUID,如果没有它又会出现什么问题。

序列化的时候系统会把当前类的serialVersionUID写入序列化文件中(如果没有会默认生成),当反序列化的时候系统会检测文件中的serialVersionUID,看它是否和当前类的serialVersionUID一致,如果一致就说明序列化的类的版本和当前类的版本是相同的,这个时候就可以反序列化成功;

那如果没有这个serialVersionUID,当当前类和序列化的类相比发生了某些变换比如某些成员变量的增加与删除,那么序列化时的默认生成的serialVersionUID就会不一样,从而导致反序列化失败。发生java.io.InvalidClassException异常。

下面我们修改User类

删除serialVersionUID(也就是让其默认生成),然后序列化

接着我们删除其中的一个成员变量,

public class User implements Serializable {//    private static final long serialVersionUID = -1L;    public int id;    public String name;    public User() {    }    public User(int id, String name) {        this.id = id;        this.name = name;    }
//getset方法省略
@Override public String toString() { return "id="+id+"\nname="+name; }}

然后开始反序列化,然后我们会发现上面所说的异常,原因是因为默认生成的serialVersionUID不一致。


所以如果一个类永不改变,serialVersionUID确实可有可无,如果确定不了为了保险还是需要设置它的serialVersionUID。避免了日后修改类里的成员变量导致反序列化失败。

还要一点就是如果反序列的化的类的类名发生了改变,那么这必将导致反序列化的失败。

还有...静态成员变量属于类不属于对象,不会参与序列化过程其次用transient关键字标记的成员变量也不会参与序列化过程

0 0