
正文
Java 序列化Serializable接口
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
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();
}
}






