Bootstrap

Java编程思想之 ----- 序列化和反序列化

一、入门

首先当然得理解什么是序列化和反序列化

  • 序列化是将Java对象序列化成二进制(即字节序列)的过程。
  • 反序列是将被字节序列重新变成Java对象的过程。

理解:本质上是改变了Java对象的生存周期,使得Java对象可以持久化存储,同时也实现了对象也可以作为网络传输的数据。

二、如何实现

通过继承 Serializable 接口便可实现对象的序列化。
在这里插入图片描述

挖坑:查看Serializable 接口可以看到是空实现,具体作用下面讲解

怎么实现直接上代码(ps:例子是抄的附上链接 序列化和反序列化的底层实现原理是什么

public class SerialDemo {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
	    //序列化
        FileOutputStream fos = new FileOutputStream("object.out");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        User user1 = new User("xuliugen", "123456", "male");
        oos.writeObject(user1);
        oos.flush();
        oos.close();
		//反序列化
        FileInputStream fis = new FileInputStream("object.out");
        ObjectInputStream ois = new ObjectInputStream(fis);
        User user2 = (User) ois.readObject();
        System.out.println(user2.getUserName()+ " " + 
	        user2.getPassword() + " " + user2.getSex());
        //反序列化的输出结果为:xuliugen 123456 male
    }
}

public class User implements Serializable {
    public static final long serialVersionUID = 42L;
    private String userName;
    private String password;
    private String sex;
    //全参构造方法、get和set方法省略
}

注意

  • static和transient修饰的属性不能被序列化

理解:
static修饰的属性值是存储在当前JVM中的
transient是因为这个关键字的特性就是防止一些属性被序列化,因为有一些敏感信息不想被别人访问(比如密码,你要是持久化对象了,别人就能读到你的密码了!)

  • 还有一个需要注意的点是那个大家都说的serialVersionUID

理解:
序列化时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号用在反序列化过程中,验证这个字节序列是否能够被转化的对象所兼容。(简单来说,就是如果反序列时定义的类的serialVersionUID和序列化时的类定义的serialVersionUID不一样,就不能被反序列。)
为它赋予明确的值。显式地定义serialVersionUID有两种用途:
1.在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
2.在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。

三、理解

如前所述,序列化和反序列化本质上是改变了Java对象的生存周期,使得Java对象可以持久化存储,同时也实现了对象也可以作为网络传输的数据。
所以,在理解序列化和反序列化的时候,不应该将它作为Java语言仅有的特性去理解,这其实就是一种解决对象存储问题的实现机制。

四、源码解析

看了网上有不少源码解析的文章,就不特地写了
源码分析(一)
源码分析(二)

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;