13.3 Java对象序列化梳理

目录

13.3 Java对象序列化

13.3.1  引入

13.3.1  对象序列化与对象流

1.Serializable接口

2.ObjectInputStream类和ObjectOutputStream类

13.3.2 向ObjectOutputStream中写入对象


13.3 Java对象序列化

13.3.1  引入

应用场景:对象的寿命通常随着创建该对象程序的终止而终止。有时可能需要将对象的状态保存下来,在需要时再将其恢复对象状态的保存和恢复可以通过对象I/O流实现。

定义:集合是指集中存放一组对象的一个对象,可以将集合看作是能够操作这些元素的容器,包括了保存、获取和操作其他元素的方法。

13.3.1  对象序列化与对象流

1.Serializable接口

将程序中的对象输出到外部设备(磁盘、网络)中,成为对象序列化(serialization)。反之,从外部设备将对象读入到程序中称为反序列化(deserialization)。一个类的对象要实现对象序列化,必须实现java.io.Serializable接口,该接口的定义如下:
public interface Serializable{}
注意:Serializable接口只是标识性接口,其中没有定义任何方法一个类的对象要序列化,除了必须实现Seriablizable接口外,还需要创建对象输入流和对象输出流,然后通过对象输出流将对象状态保存下来,通过对象输入流恢复对象的状态。

2.ObjectInputStream类和ObjectOutputStream类

在java.io包中定义了ObjectInputStream和ObjectOutputStream两个类,分别称为对象输入流和对象输出流。
ObjectInputStream类继承了InputStream,实现了ObjectInput接口,而ObjectInput接口又继承了DataInput接口。
ObjectOutputStream类继承了OutputStream类,实现了ObjectOutput接口,而ObjectOutput接口又继承了DataOutput接口(如图13-1所示)

图13-1 ObjectInputStream类和ObjectOutputStream类

13.3.2 向ObjectOutputStream中写入对象

若将对象写到外部设备需要建立ObjectOutputStream类的对象,构造方法为:


public ObjectOutputStream(OutputStream out)


参数out为一个字节流输出对象。创建了对象输出流后,就可以调用它的writeObject()方法将一个对象写入流中,该方法格式为:


public final void writeObject(Object obj) throws IOException


若写入的对象不是可序列化的,该方法会抛出NoSerializableException异常,由于ObjectOutputStream类实现了DataOutput接口,该接口定义多个方法用来写入基本数据类型,如writeInt().writeFloat()及writeDouble()等,可以使用这些方法向对象输出流中写入基本数据类型
下面代码将一些数据写到对象输出流中

FileOutputStream fos=new FileOutputStream("data.ser");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeInt(2010);
oos.writeObject("你好");
oos.writeObject(LocalDate.now());

ObjectOutputStream必须建立在另一个字节流上,上述例子是建立在FileOutputStream上的,向文件写入一个整数、字符串“你好”和一个LocalDate对象

13.3.3  从ObjectInputStream中读出对象

若要从外部设备上读取对象,需建立ObjectInputStream对象,该类的构造方法为:

public ObjectInputStream(InputStream in)

参数in为字节输入流对象。通过调用ObjectInputStream类的方法readObject()可以将一个对象读出,该方法的声明格式如下

public final Object readObject() throws IOException

在使用readObject()方法读出对象时,其类型和顺序必须与写入时一致。由于该方法返回Object类型,因此在读出对象时需要适当的类型转换

ObjectInputStream类实现了DataInput接口,该接口定义了读取基本数据类型的方法,如readInt()、readFloat()及readDouble(),使用这些方法可以从ObjectInputStream流中读取基本数据类型

下面代码在InputStream对象上创建一个对象输入流对象

FileInputStream fis=new FileInputStream("data.ser");
ObjectInputStream ois =new ObjectInputStream(fis);
int i=ois.readInt();
String today=(String)ois.readObject();
LocalDate date= (LocalDate) ois.readObject();

与ObjectOutputStream一样,ObjectInputStream也必须建立在另一个流上,本例中就是建立在FileInputStream上的。接下来使用readInt()和readObject()方法读出整数、字符串和LocalDate对象

注意事项:

1.序列化只能保存对象的非static成员,不能保存任何成员方法和static成员变量,而且序列化保存的只是变量的值
2.用transient关键字修饰的变量为临时变量,也不能被序列化
3.对于成员变量为引用类型时,引用的对象也被序列化

13.3.4  序列化数组

如果数组中的所有元素都是可序列化的,这个数组就是可序列化的。一个完整的数组可以用writeObject()方法存入文件,之后用readObject()方法读取到程序中

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值