一、Serializable 接口与 Externalizable 接口实现序列化的区别
在上一篇文章中,已经向大家介绍了对象序列化与反序列化,在文章中指出了对象如果要想被序列化,就必须实现 Serializable 接口或者 Externalizable 接口,其中 Externalizable 是 Serializable 的子接口。
既然两个接口都可以实现对象的序列化操作,那么这两个接口有什么不同呢?接下来就向大家介绍一下两个接口在实现对象序列化时两者的区别:
No. | 区别 | Serializable 接口 | Externalizable 接口 |
---|---|---|---|
1 | 实现复杂度 | 实现简单,Java对其有内建支持 | 实现复杂,由开发人员自己完成 |
2 | 执行效率 | 所有对象由 Java 同意保存,性能较低 | 开发人员决定哪个对象保存,可能的速度提升 |
3 | 保存信息 | 保存时占用空间大 | 部分存储,可能的空间减少 |
上面的表格列出了两个接口在三个方面上(实现复杂度、执行效率、保存信息)的区别。当然,在 Java 开发中,使用最多的接口还是 Serializable 接口。因为在序列化操作中,如果不希望某个属性被序列化下来,可以使用 transient 关键字声明来实现效果。transient 关键字 + Serializable 接口完全可以取代 Externalizable 接口的功能。
transient 关键字,简单地说,就是让某些被修饰的成员属性变量不被序列化。
注意:transient 关键字只能修饰变量,而不能修饰方法和类,本地变量是不能被 transient 关键字修饰的。变量如果是用户自定义类变量,则该类需要实现 Serializable 接口。
二、序列化一组对象
对象在输出时只提供了一个对象的输出操作(writeObject(Object obj)),并没有提供多个对象的输出,所以如果现在要同时序列化多个对象的时候就可以使用对象数组进行操作,因为数组属于引用数据类型,可以直接使用 Object 类型进行接收。
如果要保存多个对象,则最好使用对象数组的形式完成。
三、小结
1、对象序列化并不一定都向文件中保存,也有可能面向于其他的输入或输出;
2、被序列化时,对象必须实现 Serializable 接口,如果某个属性不希望被保存下来,则可以使用 transient 关键字声明(详见参考文章);
3、ObjectOutputStream 是序列化对象,ObjectInputStream 是反序列化对象;
4、Externalizable 接口的作用:开发人员手工实现序列化的操作;
5、使用序列化保存一组数组的时候要使用对象数组的形式操作。
希望此篇文章对大家在学习上有所帮助,若有不对之处也请指出!
参考文章:
http://blog.youkuaiyun.com/u013207877/article/details/52572975
https://www.cnblogs.com/chenpi/p/6185773.html#_label0