浅析Java中的序列化和反序列化

1、  Java序列化:是指将对象转换为字节序列的过程;

  反序列化:是指将字节序列转换成目标对象的过程。

2、要序列化一个对象,其所属的类必须实现以下两种接口之一:

  • java.io.Serializable
  • java.io.Externalizable

3、为什么要序列化呢?

  主要是为了长久保存一个对象的状态并在需要时获取该对象的信息以重新构造一个状态完全相同的对象。

在进行浏览器访问的时候,我们看到的文本、图片、音频、视频等都是通过二进制序列进行传输的,那么如果我们需要将Java对象进行传输的时候,也要将对象进行序列化。首先需要先将Java序列化,然后通过网络,IO进行传输,当到达目的地之后,在进行反序列化获取我么想要的对象,最后完成通信。

  通过写出对象的状态数据来记录一个对象。

4、实现序列化要使用到JDK中的关键类 ObjectOutputStream和ObjectInputStream

  ObjectOutputStream类中,通过使用writeObject(Object object)方法,将对象以二进制格式进行写入。

  ObjectInputStream类中,通过使用readObject()方法,从输入流中读取二进制流,转换成对象。

5、首先定义一个emp类 必须实现serializable接口才可以被序列化

Serializable 接口的作用只是用来标识我们这个类是需要进行序列化,并且Serializable 接口中并没有提供任何方法。

transient关键字是为了声明个别不希望被序列化的非static属性,比如不将对象中的密码等信息序列化,以增强安全性。

public class Emp implements Serializable{

	public static int tall=1000;
	private String name;
	private int age;
	private int sex;
	private transient int pass;
	
	
	public static int getTall() {
		return tall;
	}
	public static void setTall(int tall) {
		Emp.tall = tall;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	public int getPass() {
		return pass;
	}
	public void setPass(int pass) {
		this.pass = pass;
	}
	public Emp() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Emp(String name, int age, int sex, int pass) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.pass = pass;
	}
	@Override
	public String toString() {
		return "Emp [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
	

6、在对象序列化过程中,其所属类的static属性和方法代码不会被序列化处理。

因为static属性有整个类所有的对象共享,不应该因为一个对象的写出和恢复就将整个对象共有的这个static属性覆盖。比如在当前运行中,static属性在不断被修改,不能因为突然恢复了一个对象,就把static属性也恢复到该对象当初写出时的状态。

7、序列化对象

public static void main(String[] args) throws IOException {
		FileOutputStream out = new FileOutputStream("F:\\e.ee");
		ObjectOutputStream oos = new ObjectOutputStream(out);
		oos.writeObject(new Emp("lisi",30,1,001));
		oos.close();
		out.close();
	}

8、反序列化

public static void main(String[] args) throws IOException, ClassNotFoundException {
		FileInputStream in = new FileInputStream("F:\\e.ee");
		ObjectInputStream ois = new ObjectInputStream(in);
		
		Emp emp = (Emp)ois.readObject();
		System.out.println(emp);
		
		ois.close();
		in.close();
	}
Java中对象的序列化和反序列化还有很多种存入和读取的方法,此处只列举了一种,有意向的盆友可以去查查看哈~

猜你喜欢

转载自blog.csdn.net/amor_fatii/article/details/80156012