关于 Serializable 接口 (我的理解就是传输)
该接口中没有任何成员变量/方法,仅起到标识作用。目的是使实现该接口的类对象序列化。
如果我们需要将本地已实例化的对象传输到其他机器中,就需要将该对象以某种方式传输出去。为了满足这种需求,就产生了序列化和反序列化的概念。
序列化就是将实例化的对象转成字节流的形式,反序列化就是将字节流回转成对象。
一个类实现 Serializable 接口后,就可以将创建出的类对象序列化,进行传输。为了保证传输的对象是正确的,就有了 serialVersionUID 这个概念。
serialVersionUID
serialVersionUID 是一个常量,如果需要在两个客户端进行 Person 类对象的传输,那么就需要两个客户端的 UID 相同,不然无法进行传输。
传输时需要注意,无法进行静态变量的传输。即静态变量无法进行序列化。因为序列化与对象相关,静态与类相关,所以无法进行序列化。
如果在序列化时有某一个属性不需要进行序列化(传输),那么就可以使用 transient 关键字进行修饰,被该关键字修饰的属性就不会被序列化。
实现序列化
实现序列化的前提是,该类实现了 java.io.Serializable 接口,然后调用 ObjectOutputStream 类的 writeObject() 方法即可
注意:在继承关系下,如果父类实现 Serializable 接口,那么子类自动实现 Serializable 接口。
如果子类实现 Serializable 接口,父类没有实现 Serializable 接口,如果想要序列化父类的接口,那么就需要使父类也实现 Serializable 接口
在序列化与反序列化的过程中,序列化一个子类对象,如果父类没有实现 Serializable 接口的话,那么序列化的子类对象中如果有继承父类的属性,那么该属性在被反序列化后会显示为初始值,因为父类没有实现 Serializable 接口,所以子类继承父类的属性也无法被序列化与反序列化
实现反序列化
如果需要反序列化一个实例对象,那么需要使用 ObjectOutputStream 类的 readObject 方法,由于该方法返回 Object 类型的对象,所以需要对其做强制的类型转换