- 只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则ObjectOutputStream的writeObject(Object obj)方法会抛出IOException。
- 实现了Serializable或Externalizable接口的类也称为可序列化类。
- Externalizable接口继承Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为。而仅实现Serializable接口的类可以采用默认的序列化方式。
- Jdk的部分类 如String\Date等都实现了Serializable接口
- 假定一个Customer类,它的对象需要序列化。 可以有以下三种方式进行
- 如果customer类仅仅实现了Serializable接口的类,那么会按照以下方式进行序列化和反序列化:
- ObjectOutputStream采用默认的序列化方式,对Customer对象的非transient的实例变量进行序列化。
- ObjectInputStream采用默认的反序列化方式,对customer对象的非transient的实例变量进行反序列化。
2. 如果customer类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputStream out),那么会按照以下方式进行序列化和反序列化:
- ObjectOutputStream会调用Customer对象的writeObject(ObjectOutputStream out)方法进行序列化。
- ObjectInputStream会调用Customer对象的readObject(ObjectInputStream in)方法进行反序列化。
- 如果customer类实现了Externalizable接口,那么Customer类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,那么会按照以下方式进行序列化和反序列化:
- ObjectOutputStream会调用Customer对象的writeExternal(ObjectOutput out)方法进行序列化。
- ObjectInputStream会调用Customer对象的readExternal(ObjectInput in)方法进行反序列化。