什么是java序列化?
java序列化主要目的是将对象写入流中,便于通过网络传输该对象,当然还可以重建该对象。java序列化的API提供了可以重新生成完全相同的对象的功能,对于网络上java序列化被用来保存状态与数据库同义,这是个不明确的。
如何序列化?
如果要序列化对象需要在相应的类实现可序列化的标记,不想被序列化的对象属性可以使用transient
关键字修饰。
- 实现 java.io.Serializable 接口标记类, 暗示jvm该类可以被序列化,如果不实现接口,会抛出
java.io.NotSerializableException
异常。 - 最好在一开始就给这个类指定一个
serialVersionUID
如果有修改累的成员变量的时候,jvm就不会再根据类名,成员,包名,工程名来计算该值。
serialVersionUID是用于记录class文件的版本信息的,通过一个类的类名,成员,包名,工程名算出来的一个数字。反序列化的时候ObjectInputStream会先拿文件中的serialVersionUID
与类中的serialVersionUID
数据值进行对比,如果不一致会抛出java.io.InvalidClassException
异常,测试异常信息 :
Exception in thread "main" java.io.InvalidClassException: com.test.demo.serializationsample.Person; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
/**
* 描述:
*
* @author liweigao
* @create 2018-07-18 下午6:04
*/
@Data
@Builder
public class Person implements Serializable{
private int age;
private String name;
}
/**
* 描述:
*
* @author liweigao
* @create 2018-07-18 下午6:06
*/
public class Sample {
private static final String fileName = "SampleTest.out";
public static void serialize(Object serializableObject) throws IOException {
ObjectOutputStream oos = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(fileName);
oos = new ObjectOutputStream(fos);
oos.writeObject(serializableObject);
} finally {
if (null != oos) {
oos.close();
}
if (null != fos) {
fos.close();
}
}
}
private static Object deSerialize() throws IOException, ClassNotFoundException {
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(fileName);
ois = new ObjectInputStream(fis);
return ois.readObject();
} finally {
if (null != ois) {
ois.close();
}
if (null != fis) {
fis.close();
}
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = Person.builder().age(10).name("li").build();
serialize(person);
System.out.println("serialize success");
Person personDes = (Person) deSerialize();
System.out.println("deSerialize success " + personDes.toString());
}
}
运行main方法 输出:
serialize success
deSerialize success Person(age=10, name=li)