
1 什么是序列化和反序列化
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。
2 什么情况下需要序列化
1)当把的内存中的对象保存到一个文件中或者数据库中时候。
2)当用套接字在网络上传送对象的时候。
3)当通过RMI传输对象的时候。
3 如何实现序列化
将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。
4 序列化和反序列化流程
对象的序列化是基于字节的,首先要创建某些OutputStream(如FileOutputStream、 ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需 要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)。而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。
5 serialVersionUID的作用
当一个类实现了Seriablizable接口后,会要求添加long类型的标志位serialVersionUID,因为Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)
6 序列化例子
People.java
package com.test.serialiable; import java.io.Serializable; public class People implements Serializable { private static final long serialVersionUID = 1L; private String name = null; private Integer age = null; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
测试用例
RunSeriablizableDemo.java
package com.test.serialiable; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class RunSeriablizableDemo { File file = new File("e://temp3/my.out"); public void testSerializable() { People people = new People(); people.setName("wangwu"); people.setAge(); try { FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(people); oos.close(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void testDeSerializable() { try { FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); People p = (People) ois.readObject(); System.out.println(p); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { RunSeriablizableDemo test = new RunSeriablizableDemo(); test.testSerializable(); test.testDeSerializable(); } }