Java对象为啥要实现可序列化的接口?

  

 Java对象为啥要实现可序列化的接口?

  

<>强导读

  

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

  

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

  

<>强可序列化的接口概述

  

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

  

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

  

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

  

先定义一个序列化对象用户:

  
 <代码>公共类用户实现Serializable {
  私有静态最终长serialVersionUID l=1;
  
  私人字符串标识;
  私人字符串的用户名;
  
  公共用户(String userId, String用户名){
  这一点。用户id=标识;
  这一点。用户名=用户名;
  }
  } 
  

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

  
 <代码>公共类SerializableTest {/* *
  *将用户对象作为文本写入磁盘
  */公共静态孔隙writeObj () {
  用户用户=新用户(“1001”,“乔”);
  尝试{
  ObjectOutputStream ObjectOutputStream=new ObjectOutputStream(新FileOutputStream("/用户/guanliyuan/. txt "));
  objectOutputStream.writeObject(用户);
  objectOutputStream.close ();
  }捕捉(IOException e) {
  e.printStackTrace ();
  }
  }
  
  公共静态void main (String参数[]){
  writeObj ();
  }
  } 
  

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

  

 Java对象为啥要实现可序列化的接口?

  

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

  
 <代码> . io .NotSerializableException: cn.wudimanong.serializable.User
  java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java: 1184)
  java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java: 348)
  在cn.wudimanong.serializable.SerializableTest.writeObj (SerializableTest.java: 19)
  在cn.wudimanong.serializable.SerializableTest.main (SerializableTest.java: 27) 

Java对象为啥要实现可序列化的接口?