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

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

发布时间:2019-05-17 05:31:37 所属栏目:建站 来源:无敌码农
导读:导读 最近这段时刻一向在忙着编写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操纵耐久化的。

(编辑:河北网)

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

热点阅读