Java序列化

    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。

你可能感兴趣的:(Java序列化)