对象的序列化(Serialize)指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象,如果需要让某个对象支持序列化机制,则必须让它的类是可序列化的(serializable)。 为了让某个类是可序列化的,该类必须实现如下两个接口之一:
1、Serializable(常用)
2、Externalizable(不常用)
Java很多类已经实现了Serializable接口,该接口是一个标记接口,实现该接口无须实现任何方法,它只是表明该类的实例是可序列化的。所有可能在网络上传输的对象的类都应该是可序列化的,否则程序将会出现异常。
对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流(无论是从磁盘中获取的,还是通过网络获取的),都可以将这种二进制流恢复成原来的Java对象。
序列化机制允许将实现序列化的Java对象转换成字节序列,这些字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。这些字节序列可以保存在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象。将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
序列化机制使得对象可以脱离程序的运行而独立存在,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
下面演示如何序列化和反序列化一个对象:
首先准备好一个实现Serializable接口的可序列化的类:
序列化的第一步是创建对象
Person person=new Person();
person.name="某某";
person.age=18;
然后创建一个输出流
//当序列化一个对象到文件时,按照Java的标准约定是给文件一个.ser扩展名
OutputStream out = new FileOutputStream("G:\\z\\z\\person.ser");
然后把对象序列化,写入文件
ObjectOutputStream outputStream = new ObjectOutputStream(out);
outputStream.writeObject(person);
outputStream.close();
程序执行后,就创建了一个名为person.ser的文件,如下:
反序列化的第一步是创建输入流,路径是序列化创建的文件的所在路径
InputStream in = new FileInputStream("G:\\z\\z\\person.ser");
ObjectInputStream inputStream = new ObjectInputStream(in);
然后读取文件,强制转换成Person类的类型
Person person2 = (Person)inputStream.readObject();//需强制转换
inputStream.close();
System.out.println(person2.name);
System.out.println(person2.age);
输出结果如下: