加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

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

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

导读

最近这段时间一直在忙着编写Java业务代码,麻木地搬着Ctrl-C、Ctrl-V的砖,在不知道重复了多少次定义Java实体对象时“implements Serializable”的C/V大法后,脑海中突然冒出一个思维(A):问了自己一句“Java实体对象为什么一定要实现Serializable接口呢?”,关于这个问题,脑海中的另一个思维(B)立马给出了回复“居然问这么幼稚和基础的问题,实现Serilizable接口是为了序列化啊!”,思维(A):“哦,好吧!然而,然后呢?”

此时思维(B)陷入了沉默,突然感觉自己有点浅薄了,好像写了这么多年Java还真是没有太关注过Serializable这个接口!为什么一定要实现Serializable接口?它的底层原理是什么?为什么一定要序列化,序列化又是什么?关于这些问题,不知道各位读者朋友有没有过类似的问题,如果有那么我们就在这篇文章中一起寻找答案吧!当然,如果你对这些问题都很清楚,也欢迎表达看法!

Serializable接口概述

Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。例如,我们可以将序列化对象写入文件后,再次从文件中读取它并反序列化成对象,也就是说,可以使用表示对象及其数据的类型信息和字节在内存中重新创建对象。

而这一点对于面向对象的编程语言来说是非常重要的,因为无论什么编程语言,其底层涉及IO操作的部分还是由操作系统其帮其完成的,而底层IO操作都是以字节流的方式进行的,所以写操作都涉及将编程语言数据类型转换为字节流,而读操作则又涉及将字节流转化为编程语言类型的特定数据类型。而Java作为一门面向对象的编程语言,对象作为其主要数据的类型载体,为了完成对象数据的读写操作,也就需要一种方式来让JVM知道在进行IO操作时如何将对象数据转换为字节流,以及如何将字节流数据转换为特定的对象,而Serializable接口就承担了这样一个角色。

下面我们可以通过例子来实现将序列化的对象存储到文件,然后再将其从文件中反序列化为对象,代码示例如下:

先定义一个序列化对象User:

  1. public class User implements Serializable { 
  2.     private static final long serialVersionUID = 1L; 
  3.  
  4.     private String userId; 
  5.     private String userName; 
  6.  
  7.     public User(String userId, String userName) { 
  8.         this.userId = userId; 
  9.         this.userName = userName; 
  10.     } 

然后我们编写测试类,来对该对象进行读写操作,我们先测试将该对象写入一个文件:

  1. public class SerializableTest { 
  2.  
  3.     /** 
  4.      * 将User对象作为文本写入磁盘 
  5.      */ 
  6.     public static void writeObj() { 
  7.         User user = new User("1001", "Joe"); 
  8.         try { 
  9.             ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("/Users/guanliyuan/user.txt")); 
  10.             objectOutputStream.writeObject(user); 
  11.             objectOutputStream.close(); 
  12.         } catch (IOException e) { 
  13.             e.printStackTrace(); 
  14.         } 
  15.     } 
  16.  
  17.     public static void main(String args[]) { 
  18.         writeObj(); 
  19.     } 

运行上述代码,我们就将User对象及其携带的数据写入了文本user.txt中,我们可以看下user.txt中存储的数据此时是个什么格式:

  1. java.io.NotSerializableException: cn.wudimanong.serializable.User 
  2.     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 
  3.     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
  4.     at cn.wudimanong.serializable.SerializableTest.writeObj(SerializableTest.java:19) 
  5.     at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:27) 

我们看到对象数据以二进制文本的方式被持久化到了磁盘文件中。在进行反序列化测试之前,我们可以尝试下将User实现Serializable接口的代码部分去掉,看看此时写操作是否还能成功,结果如下:

结果不出所料,果然是不可以的,抛出了NotSerializableException异常,提示非可序列化异常,也就是说没有实现Serializable接口的对象是无法通过IO操作持久化的。

(编辑:核心网)

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

热点阅读