接上篇文章:南极的冰疙瘩如何通过细管运到北极呢?序列化
5、Java对象存入文件
User类同上
Test测试类:
运行结果:
额?address是static修饰的,也序列化了?
我们改下代码,设置address为北京,去掉序列化代码,直接对刚才生成的文件进行反序列化。
运行结果:
如果address参与序列化的话,address应该是上海,所以static修饰的的属性,不参与序列化。
另外也可以对比两次生成的u.txt内容是否有变化,如果没有变化,则也可以说明问题。
u.txt文件内容如下:
其他测试操作同上,不再重复。
6、实现对象部分属性序列化
a、使用transient关键字(上面已测试)
b、添加writeObject和readObject方法
c、实现Externalizable接口
添加writeObject和readObject方法
Java调用ObjectOutputStream类检查其是否有私有的,无返回值的writeObject方法,如果有,其会委托该方法进行对象序列化。
实现Externalizable接口
User类添加方法:
Externalizable 和 Serializable比较一下:
【1】 Serializable 是标识接口,不用重写任何方法
Externalizable 接口继承于Serializable,需要重写readExternal和writeExternal方法
【2】Serializable提供了两种方式进行对象的序列化
采用默认序列化方式,将非transatient和非static的属性进行序列化
编写readObject和writeObject完成部分属性的序列化
Externalizable 接口的序列化,需要重写writeExternal和readExternal方法。
【3】Externalizable接口的实现方式一定要有默认的无参构造函数,否则会报错
Serializable接口实现,其采用反射机制完成内容恢复,没有一定要有无参构造函数的限制。
【4】相比较Serializable, Externalizable序列化、反序列更加高效,占用内存更小
在实际项目中,大部分的类还是推荐使用Serializable, 有些类可以使用Externalizable接口,如:完全控制序列的流程和逻辑;需要大量的序列化和反序列化操作,而你比较关注资源和性能。 当然,这种情况下,我们一般还会考虑第三方序列化/反序列化工具,如protobuf等进行序列化和反序列化操作。
总之需要根据项目实际情况来选择。
领取专属 10元无门槛券
私享最新 技术干货