本章目标:
理解什么是Serializable(序列化)
了解Serializable(序列化)原理
多对象Serializable(序列化)的实现
Clone
1.什么是序列化?什么是反序列化?
序列化: 把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
2.为什么需要序列化?
在当今的网络社会,我们需要在网络上传输各种类型的数据,包括文本、图片、音频、视频等,
而这些数据都是以二进制序列的形式在网络上传送的,那么发送方就需要将这些数据序列化为字节流后传输,
而接收方接到字节流后需要反序列化为相应的数据类型。当然接收方也可以将接收到的字节流存储到磁盘中,等到以后想恢复的时候再恢复。
3.对象的序列化和反序列化主要有两种用途:
把对象的字节序列永久地保存到磁盘上。(持久化对象)
可以将Java对象以字节序列的方式在网络中传输。(网络传输对象)
4.如何序列化和反序列化?
如果要让某个对象支持序列化机制,则其类必须实现下面这两个接口中任一个。
Serializable
public interface Serializable {
}
1
Externalizable
public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
5.实现Serializable接口
如果是对序列化的需求非常简单,没有对序列化过程控制的需求,可以简单实现Serializable接口即可。
从Serializable的源码可知,其是一个标记接口,无需实现任何方法。例如我们有如下的Student类
public class Student implements Serializable {
private String name;
private int age;
public Student(String name,int age)
{
System.out.println("有参数构造器执行");
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
6.序列化: 那么我们如何将此类的对象序列化后保存到磁盘上呢?
创建一个 ObjectOutputStream 输出流oos
调用此输出流oos的writeObject()方法
private static void serializ()
{
try (ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("object.txt"));)
{
Student s=new Student("ben",18);
oos.writeObject(s);
} catch (IOException e) {
e.printStackTrace();
}
}
7.反序列化:我们如从文本文件中将此对象的字节序列恢复成Student对象呢?
创建一个ObjectInputStream 输入流ois
调用此输入流ois的readObject()方法。
private static void deSerializ()
{
try(ObjectInputStream ois=new ObjectInputStream(new FileInputStream("object.txt"));)
{
Student s= (Student) ois.readObject();
System.out.println(s.toString());
}catch (Exception e)
{
e.printStackTrace();
}
}
8.版本 serialVersionUID
由于反序列化Java对象的时候,必须提供该对象的class文件,但是随着项目的升级class文件文件也会升级,Java如何保证兼容性呢?
答案就是 serialVersionUID。每个可以序列化的类里面都会存在一个serialVersionUID,只要这个值前后一致,即使类升级了,
系统仍然会认为他们是同一版本。如果我们不显式指定一个,系统就会使用默认值。
9.心得
苦与乐,是冤家,也是亲家。最大的欢乐,往往包含在巨大的艰辛之中。犹如明珠藏于大海,宝藏埋于深山。
花儿不为谁开,也可以为自己开,世界不为谁存在,也可以为自己存在。
一个人对于苦乐的看法并不是一定,也不是永久的。许多当年深以为苦的事,现在想起来却充满了快乐。