Java 中为什么要序列化?什么时候用到序列化?









什么是序列化

序列化 (Serialization) 是一种用来处理对象流的机制,即将对象写入到 IO 流中。

所谓对象流就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间;序列化是为了解决在对象流进行读写操作时所引发的问题。序列化的思想是“冻结”对象状态,然后写到磁盘或者在网络中传输;反序列化的思想是“解冻”对象状态,重新获得可用的 Java 对象。

序列化的实现:

将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的;
然后使用一个输出流(如:FileOutputStream )来构造一个ObjectOutputStream (对象流)对象;
接着,使用 ObjectOutputStream 对象的 writeObject(Object obj) 方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流即可。



什么时候使用序列化

① 对象序列化可以实现分布式对象。主要应用例如:RMI (remote method invoke,即远程方法调用)要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

② Java 对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。



注意事项

所有需要网络传输的对象都需要实现序列化接口,通过建议所有的 javaBean 都实现 Serializable 接口。

对象的类名、实例变量(包括基本类型,数组,对其他对象的引用)都会被序列化;方法、类变量、transient 实例变量都不会被序列化。

如果想让某个变量不被序列化,使用 transient 修饰。

序列化对象的引用类型成员变量,也必须是可序列化的,否则,会报错。

反序列化时必须有序列化对象的 class 文件。

当通过文件、网络来读取序列化后的对象时,必须按照实际写入的顺序读取。

单例类序列化,需要重写 readResolve() 方法;否则会破坏单例原则。

同一对象序列化多次,只有第一次序列化为二进制流,以后都只是保存序列化编号,不会重复序列化。

建议所有可序列化的类加上 serialVersionUID 版本号,方便项目升级。











Note:
欢迎点赞,留言,转载请在文章页面明显位置给出原文链接
知者,感谢您在茫茫人海中阅读了我的文章
没有个性 哪来的签名!
详情请关注点我
持续更新中

扫一扫 有惊喜!
© 2021 03 - Guyu.com | 【版权所有 侵权必究】

猜你喜欢

转载自blog.csdn.net/weixin_49770443/article/details/114262080