Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化。简洁点说,Java序列化的流程为“对象->字节序列->对象”。
注意:一个类的对象要想序列化成功,必须满足两个条件:
该类必须实现 java.io.Serializable 对象。
该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。
下面为Java代码实例
Java序列化
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
//Java序列化
public class Person_SerializeTest {
public Person_SerializeTest(){
Person person =new Person(); //申明Person对象person
person.name ="张三"; //添加属性值
person.sex ="男";
person.age =18;
person.number =110;
try{
//新建文件Person.ser
FileOutputStream fileout =new FileOutputStream("C:/Users/My/IdeaProjects/Java_Serialization/Person.ser");
ObjectOutputStream out =new ObjectOutputStream(fileout);
out.writeObject(person); //将对象序列化,即将对象及其信息写进.ser文件
out.close();
fileout.close();
System.out.print("序列化成功,保存在C:/Users/My/IdeaProjects/Java_Serialization/Person.ser");
}catch(IOException i){
i.printStackTrace();
}
}
}
运行结果如下:
注意: 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名。
Java反序列化
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
//Java反序列化
public class Person_DeserializeTest {
public Person_DeserializeTest(){
Person person =new Person(); //申明Person对象
try{
//读取文件Person.ser
FileInputStream filein =new FileInputStream("C:/Users/My/IdeaProjects/Java_Serialization/Person.ser");
ObjectInputStream in =new ObjectInputStream(filein);
person = (Person)in.readObject(); //反序列化,即读取对象及其相关信息
in.close();
filein.close();
}catch (IOException i){
i.printStackTrace();
return;
}catch (ClassNotFoundException c){
System.out.print("未找到文件");
c.printStackTrace();
return;
}
System.out.print("姓名:"+person.name+"\n性别:"+person.sex+"\n年龄:"+person.age+"\n号码:"+person.number);
}
}
运行结果如下:
注意:readObject() 方法中的 try/catch代码块尝试捕获 ClassNotFoundException 异常。对于 JVM 可以反序列化对象,它必须是能够找到字节码的类。如果JVM在反序列化对象的过程中找不到该类,则抛出一个 ClassNotFoundException 异常,在该实例中readObject() 方法的返回值被转化成 Employee 引用。另外,因为属性number是短暂的,该值没有被发送到输出流,所以反序列化后 Employee 对象的 number 属性为 0。