目录
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()方法读取到程序中
标签:ObjectOutputStream,ObjectInputStream,对象,接口,Java,序列化,13.3 From: https://blog.csdn.net/haozihua/article/details/141543367