点击上方"java全栈技术"关注,每天学习一个java知识点
什么是序列化
我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。
Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的。
如何序列化一个对象
要序列化一个对象,这个对象所在类就必须实现Java序列化的接口:java.io.Serializable。
序列化/反序列化
可以借助commons-lang3工具包里面的类实现对象的序列化及反序列化。
输出:
User{username='Java', address='China'}
上例通过序列化对象字节到内存然后反序列化,当然里面也提供了序列化磁盘然后再反序列化的方法,原理都是一样的,只是目标地不一样。
序列化注意事项
- 序列化对象必须实现序列化接口。
- 序列化对象里面的属性是对象的话也要实现序列化接口。
- 类的对象序列化后,类的序列化ID不能轻易修改,不然反序列化会失败。
- 类的对象序列化后,类的属性有增加或者删除不会影响序列化,只是值会丢失。
- 如果父类序列化了,子类会继承父类的序列化,子类无需添加序列化接口。
- 如果父类没有序列化,子类序列化了,子类中的属性能正常序列化,但父类的属性会丢失,不能序列化。
- 用Java序列化的二进制字节数据只能由Java反序列化,不能被其他语言反序列化。如果要进行前后端或者不同语言之间的交互一般需要将对象转变成Json/Xml通用格式的数据,再恢复原来的对象。
- 如果某个字段不想序列化,在该字段前加上transient关键字即可。
目前 Oracle 公司计划废除 Java 中的古董--序列化技术,因为它带来了许多严重的安全问题(如序列化存储安全、反序列化安全、传输安全等),据统计,至少有3分之1的漏洞是序列化带来的,这也是 1997 年诞生序列化技术的一个巨大错误。
如图所示,序列化技术现在在 Java 应用中无处不在,特别是现在的持久化框架和分布式技术中,都需要利用序列化来传输对象,如:Hibernate、Mybatis、Java RMI、Dubbo等,即对象要存储或者传输都不可避免要用到序列化技术,所以删除序列化技术将是一个长期的计划。
据悉,在未来的 Java 版本中,将会有一个迷你序列化框架来替代现在的古董序列化技术。这个新框架将会支持开发者值入序列化引擎,并支持如 JSON、XML 格式,以一个更安全的方式来序列化对象。
序列化技术自 Java 诞生到现在已经发展了 20 来年了,但并未有什么改进和突破。也因为其简单易用的方式,给 Java 应用程序带来了许多安全漏洞。现在 Oracle 版本发布越来越快,让我们在新的版本中能看到更多序列化技术演进吧!
文章摘自java技术栈
閱讀更多 java全棧技術 的文章