详解Java 序列化与反序列化(Serialization)
一、什么是?为什么需要?
序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,反序列化则为其逆过程。
内存的易失性;传输需要;一些应用场景中需要将对象持久化下来,以便在需要的时候进行读取。
二、JDK提供的API
java.io.ObjectOutputStream类的writeObject(Objectobj)方法
java.io.ObjectInputStream类的readObject()方法
对于Serializable,如果没有重写writeObject和readObject,则调用默认的方法
Externalizable继承了Serializable,多了2个方法:writeExternal和readExternal,用来控制需要序列化哪些字段
三、实现方法
假定一个Person类,实现了Serializable或Externalizable接口
importjava.io.Serializable;
/**
*@Author:pf_xu
*@Date:2019/3/512:37
*@Version1.0
*/
publicclassPersonimplementsSerializable{
privateintage;
privateStringname;
publicPerson(intage,Stringname){
this.age=age;
this.name=name;
}
publicvoidsetAge(intage){
this.age=age;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicStringgetName(){
returnname;
}
}
importjava.io.Externalizable;
importjava.io.IOException;
importjava.io.ObjectInput;
importjava.io.ObjectOutput;
/**
*@Author:pf_xu
*@Date:2019/3/513:01
*@Version1.0
*/
publicclassSpecialPersonimplementsExternalizable{
privateintage;
privateStringname;
publicSpecialPerson(){}
publicSpecialPerson(intage,Stringname){
this.age=age;
this.name=name;
}
publicvoidsetAge(intage){
this.age=age;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicStringgetName(){
returnname;
}
@Override
publicvoidwriteExternal(ObjectOutputout)throwsIOException{
out.writeObject(age);
out.writeObject(name);
}
@Override
publicvoidreadExternal(ObjectInputin)throwsIOException,ClassNotFoundException{
this.age=(Integer)in.readObject();
this.name=(String)in.readObject();
}
}
importjava.io.*;
/**
*@Author:pf_xu
*@Date:2019/3/512:40
*@Version1.0
*/
publicclassSerializableDemo{
publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{
Personperson=newPerson(10,"Simon");
ObjectOutputStreamoos1=newObjectOutputStream(newFileOutputStream("object1.out"));
oos1.writeObject(person);
ObjectInputStreamois1=newObjectInputStream(newFileInputStream("object1.out"));
Personre_person=(Person)ois1.readObject();
System.out.println(re_person.getName()+"---"+re_person.getAge());
SpecialPersonspecialPerson=newSpecialPerson(30,"Daniel");
ObjectOutputStreamoos2=newObjectOutputStream(newFileOutputStream("object2.out"));
oos2.writeObject(specialPerson);
ObjectInputStreamois2=newObjectInputStream(newFileInputStream("object2.out"));
SpecialPersonre_specialPerson=(SpecialPerson)ois2.readObject();
System.out.println(re_specialPerson.getName()+"---"+re_specialPerson.getAge());
}
}
四、一些细节
1.序列化ID
serialVersionUID 如果两个类的ID不同,则不能互相序列与反序列(可应用与版本控制,不同版本的类相互兼容或者不兼容)
2.安全性
由于其标准化导致其有泄露的风险(二进制明文,可采用加密的方法)
以上所述是小编给大家介绍的Java序列化和反序列化详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!