1)概念: 序列化:把java对象转换为字节序列的过程。 反序列化:把字节序列恢复为Java对象的过程。java
2)做用: 数据的持久化。 进行远程通讯(即:在网络上传送对象的字节序列) 3)实现:要序列化的类必须实现Serializable接口: 1)若类实现了Serializable接口: 使用ObjectOutputStream的writeObject(Object obj)方法来实现序列化,使用ObjectInputStream的readObject()方法来实现反序列化。 举例: // 序列化 Person person1 = new Person("jack", 17); Person person2 = new Person("jack", 18); File file = new File("D:\\test\\Person.txt"); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(person1); // 注:若Person未实现Serializable接口,则writeObject(Object obj)方法会报java.io.NotSerializableException的错误。 oos.writeObject(person2); oos.close(); fos.close(); // 反序列化 FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); Person person11 = (Person) ois.readObject(); Person person22 = (Person) ois.readObject(); ois.close(); fis.close(); 2)若类实现了Serializable接口,且定义了writeObject方法和readObject方法: 使用类本身定义的writeObject(java.io.ObjectOutputStream s)方法 和 readObject(java.io.ObjectInputStream s)方法 来实现序列化和反序列化。 举例:ArrayList类 3)若类实现了Externalizable接口: 使用类实现的writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in) 方法来实现序列化和反序列化。 说明:Externalizable接口继承了Serializable接口,Externalizable接口定义了两个方法:writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in) 4)注意: 1)反序列化的顺序必定要和序列化的顺序相同。 2)类中被transient关键字修饰的属性不会被序列化。 说明:若类实现了Externalizable接口,那么transient修饰的属性是否能够序列化取决于该类自定义的writeExternal和readExternal方法的实现。 3)类中的静态属性不会被实例化。 4)类中若是未显式声明静态属性serialVersionUID,那么在序列化时将基于该类的各个方面计算该类的默认serialVersionUID值。尽管如此,咱们仍是强烈建议全部可序列化的类都显式声明serialVersionUID 值,且serialVersionUID建议声明为private的。 说明: 1>计算默认的serialVersionUID对类的详细信息具备较高的敏感性,根据编译器实现的不一样可能千差万别,这样在反序列化过程当中可能会致使意外的InvalidClassException。 2>数组类不能声明一个明确的serialVersionUID,所以它们老是具备默认的计算值,可是数组类没有匹配 serialVersionUID 值的要求。