Java的序列化和反序列化大家基本上都听说过,但是一旦问到底层是怎么实现的,大家一般就很少关注了,今天我们一起来看看它们到底是怎么实现的。

1、序列化反序列化的作用

      Java的序列化和反序列化的主要作用就是用在两个Java进程之间相互传输时所使用。因为利用序列化和反序列化,我们可以实现两个进程间的Java对象传输。

      序列化:将Java对象按照一定的格式输出为字节序列,它可以完整的保持Java对象的所有状态和描述信息。从而将其传递给另外的Java进程或者保存在本地。其最核心的工作量就在于Java对象的分解和重建。

      反序列化:顾名思义,Java序列化的反过程,将已经序列化的字节序列转化成有效完整的Java对象的过程,这就是反序列化。

2、序列化的好处

      序列化的主要优点在于三点:

     1、序列化提供了一种将Java对象持久化的一种方式,序列化后的字符序列可以保存在本地,在下次需要使用时直接读取进入内存中使用。

     2、使得Java对象可以在两个Java进程之间进行传输了。

     3、提供了一种方式可以使得Java对象能够通过网络之间进行通信传输。 

3、序列化的具体流程和特点

     序列化的主要流程有以下四点:

              1、首先将相关的所有对象的类元数据全部按格式输出;

              2、按照递归的顺序将该类的所有父类的类描述全部序列化输出(即自下而上输出类描述);

              3、递归输出完所有的类元数据之后,从最上层的父类开始先输出Java对象的所有实例信息(即自上而下输出实例信息);

              4、最后输出待序列化的类实例的所有信息;


4、序列化的例子
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerialDemo {

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

class User implements Serializable {
    private String userName;
    private String password;
    private String sex;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public User(String userName, String password, String sex) {
		super();
		this.userName = userName;
		this.password = password;
		this.sex = sex;
	}
    
}