加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java对象为啥要实现Serializable接口?

发布时间:2019-05-15 01:13:12 所属栏目:优化 来源:无敌码农
导读:导读 最近这段时间一直在忙着编写Java业务代码,麻木地搬着Ctrl-C、Ctrl-V的砖,在不知道重复了多少次定义Java实体对象时implements Serializable的C/V大法后,脑海中突然冒出一个思维(A):问了自己一句Java实体对象为什么一定要实现Serializable接口呢?,

接下来,我们继续编写测试代码,尝试将之前持久化写入user.txt文件的对象数据再次转化为Java对象,代码如下:

  1. public class SerializableTest { 
  2.     /** 
  3.      * 将类从文本中提取并赋值给内存中的类 
  4.      */ 
  5.     public static void readObj() { 
  6.         try { 
  7.             ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/Users/guanliyuan/user.txt")); 
  8.             try { 
  9.                 Object object = objectInputStream.readObject(); 
  10.                 User user = (User) object; 
  11.                 System.out.println(user); 
  12.             } catch (ClassNotFoundException e) { 
  13.                 e.printStackTrace(); 
  14.             } 
  15.         } catch (IOException e) { 
  16.             e.printStackTrace(); 
  17.         } 
  18.     } 
  19.  
  20.  
  21.     public static void main(String args[]) { 
  22.         readObj(); 
  23.     } 

通过反序列化操作,可以再次将持久化的对象字节流数据通过IO转化为Java对象,结果如下:

  1. cn.wudimanong.serializable.User@6f496d9f 

此时,如果我们再次尝试将User实现Serializable接口的代码部分去掉,发现也无法再文本转换为序列化对象,报错信息为:

  1. ava.io.InvalidClassException: cn.wudimanong.serializable.User; class invalid for deserialization 
  2.     at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:157) 
  3.     at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:862) 
  4.     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2038) 
  5.     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568) 
  6.     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428) 
  7.     at cn.wudimanong.serializable.SerializableTest.readObj(SerializableTest.java:31) 
  8.     at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:44) 

提示非法类型转换异常,说明在Java中如何要实现对象的IO读写操作,都必须实现Serializable接口,否则代码就会报错!

序列化&反序列化

通过上面的阐述和示例,相信大家对Serializable接口的作用是有了比较具体的体会了,接下来我们上层到理论层面,看下到底什么是序列化/反序列化。序列化是指把对象转换为字节序列的过程,我们称之为对象的序列化,就是把内存中的这些对象变成一连串的字节(bytes)描述的过程。

而反序列化则相反,就是把持久化的字节文件数据恢复为对象的过程。那么什么情况下需要序列化呢?大概有这样两类比较常见的场景:1)、需要把内存中的对象状态数据保存到一个文件或者数据库中的时候,这个场景是比较常见的,例如我们利用mybatis框架编写持久层insert对象数据到数据库中时;2)、网络通信时需要用套接字在网络中传送对象时,如我们使用RPC协议进行网络通信时;

关于serialVersionUID

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读