Java中为什么实体类需要实现序列化

您所在的位置:网站首页 序列化操作 Java中为什么实体类需要实现序列化

Java中为什么实体类需要实现序列化

2023-08-10 03:15| 来源: 网络整理| 查看: 265

一、什么是Java序列化与反序列化?

Java序列化是指将数据结构或Java对象转换成二进制串的过程,而Java反序列化是指将在序列化过程中所生成的二进制串恢复成数据结构或者Java对象的过程

序列化: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输),就是目前使用比较火的分布式框架的时候,就需要让我们的Java实体类对象实现Serializable接口,目的就是为了让其可序列化。对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。反序列化: 反序列化就是客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状态及描述信息,通过反序列化恢复成Java对象,这个过程就是反序列化了。

当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化了。

二、为什么Java类需要实现Serializable接口?

序列化是一种用来处理对象流的机制 ,所谓对象流就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间;序列化是为了解决在对对象流进行读写操作时所引发的问题,将对象的状态信息转换为可以存储或传输的形式的过程。

如果你还纠结于Java Web开发过程中,有些对象为何要实现Serializable接口,那么我可以给你举个简单的例子: 比如在SSM或者SpringBoot开发的项目中,几乎都是基于Restful风格,HTTP+JSON格式进行数据传输,在Controller层返回数据响应到浏览器之前,会将数据转换为JSON字符串,那么你思考过为何要这么做吗,很简单,因为String字符串底层也实现了序列化,因为后端的数据想要响应给浏览器,就必须进行网络传输,也就意味着需要序列化操作。

下面截一段String底层实现的核心源码你就明白了:

序列化的实现: 

将需要被序列化的类去实现implements  Serializable接口,Serializable是一个空接口,没有需要实现的方法,只是为了标注该对象是可被ObjectOutputStream 序列化以及被 ObjectInputStream 反序列化;

使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,相反,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流;

三、什么时候Java类需要实现序列化? 对象序列化可以实现分布式对象。主要应用例如:RMI(即远程调用Remote Method Invocation)要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。序列化可以将内存中的类写入文件或数据库中。比如将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。对象、文件、数据,有许多不同的格式,很难统一传输和保存

结论:

在需要网络通讯、RPC远程调用等场景中,需要对Java实体类进行序列化和反序列化, 因为JAVA中要将对象序列化 为 流 的 形式进行传输, 序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件

四、如何让某些成员属性变量不被序列化(transient关键字)     

在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。PS,记得之前看HashMap源码的时候,发现有个字段是用transient修饰的,我觉得还是有道理的,确实没必要对这个modCount字段进行序列化,因为没有意义,modCount主要用于判断HashMap是否被修改(像put、remove操作的时候,modCount都会自增),对于这种变量,一开始可以为任何值,0当然也是可以(new出来、反序列化出来、或者克隆clone出来的时候都是为0的),没必要持久化其值。

五、关于transient使用小结 一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。 六、序列化可以将内存中的类写入文件或数据库中。

比如:将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。

总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。

七、对象、文件、数据,有许多不同的格式,很难统一传输和保存。

序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。

八、如何实现Java序列化与反序列化 首先我们要把准备一个Person类,同时实现 Serializabel序列化接口: import java.io.Serializable; public class Person implements Serializable { //本类可以序列化 private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "姓名:" + this.name + ",年龄" + this.age; } } 我们将Person类的name和age序列化(也就是把这2个对象转为二进制),然后又反序列化,如下: import java.io.File; import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class ObjectOutputStreamDemo { //序列化 public static void main(String[] args) throws Exception { /** * 序列化到磁盘文件person.txt */ //序列化后生成指定文件路径 File file = new File("G:\\temp\\persion.txt"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); //实例化类 Person person = new Person("Thinking曹", 25); oos.writeObject(person); //把类对象序列化 oos.close(); /** * 将person.txt反序列化成Person实体类对象 */ ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("G:\\temp\\persion.txt"))); Object object = ois.readObject(); System.out.println("object = " + object); } }

序列化后:

反序列化后:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3