java中的序列化:
1)概念:
序列化:把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 值的要求。
java中的序列化
最新推荐文章于 2023-10-03 19:57:43 发布