一、基本概念

1、序列化和反序列化的定义:

(1)Java序列化就是指把Java对象转换为字节序列的过程

Java反序列化就是指把字节序列恢复为Java对象的过程。

(2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)

2、json/xml的数据传递:

在数据传输(也可称为网络传输)前,先通过序列化工具类将Java对象序列化为json/xml文件。

在数据传输(也可称为网络传输)后,再将json/xml文件反序列化为对应语言的对象

3、序列化优点:

①将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)。

②序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。

③通过序列化可以在进程间传递对象。

4、序列化算法需要做的事:

① 将对象实例相关的类元数据输出。

② 递归地输出类的超类描述直到不再有超类。

③ 类元数据输出完毕后,从最顶端的超类开始输出对象实例的实际数据值。

④ 从上至下递归输出实例的数据。

二、Java实现序列化和反序列化的过程

1、实现序列化的必备要求:

只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)

2、JDK中序列化和反序列化的API:

①java.io.ObjectInputStream:对象输入流。

该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。

②java.io.ObjectOutputStream:对象输出流。

该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。

3、实现序列化和反序列化的三种实现:

①若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化。

ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。 
             ObjcetInputStream采用默认的反序列化方式,对Student对象的非transient的实例变量进行反序列化。

②若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。

ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。 
           ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。

③若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。

ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。 
           ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。

4、序列化和反序列化代码示例

public class SerializableTest {public static void main(String[] args) throws IOException, ClassNotFoundException {//序列化FileOutputStream fos = new FileOutputStream("object.out");ObjectOutputStream oos = new ObjectOutputStream(fos);Student student1 = new Student("lihao", "wjwlh", "21");oos.writeObject(student1);oos.flush();oos.close();//反序列化FileInputStream fis = new FileInputStream("object.out");ObjectInputStream ois = new ObjectInputStream(fis);Student student2 = (Student) ois.readObject();System.out.println(student2.getUserName()+ " " +student2.getPassword() + " " + student2.getYear());}}

三、序列化和反序列化的注意点:

①序列化时,只对对象的状态进行保存,而不管对象的方法。

②当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。

③当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。

④并非所有的对象都可以序列化,至于为什么不可以,有很多原因了,比如:

安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行RMI传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的;

资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现;

⑤声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。

⑥序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。为它赋予明确的值。显式地定义serialVersionUID有两种用途。

在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID。

在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。

⑦Java有很多基础类已经实现了serializable接口,比如String,Vector等。但是也有一些没有实现serializable接口的。

⑧如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存!这是能用序列化解决深拷贝的重要原因。

序列化和反序列化有什么作用?相关推荐

  1. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,se ...

  2. Java 之 Serializable 序列化和反序列化的概念,作用的通俗的解释

    1.序列化和反序列化的疑问 遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用.为啥要实现这个 Serializable 接口, ...

  3. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释【转】

    转载自:https://blog.csdn.net/qq_27093465/article/details/78544505 遇到这个 Java Serializable 序列化这个接口,我们可能会有 ...

  4. 什么是序列化与反序列化,为什么序列化

    转载:https://blog.csdn.net/qq_27093465/article/details/78544505 遇到这个 Java Serializable 序列化这个接口,我们可能会有如 ...

  5. (转)Serializable 序列化和反序列化

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,se ...

  6. 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。

    欢迎大家关注我的公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 遇到这个 Java Serializable 序列化这个接口,我们可 ...

  7. java序列化和反序列化以及序列化ID的作用分析

     java序列化和反序列化 一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一 ...

  8. Java对象表示方式1:序列化、反序列化和 transient 关键字的作用

    前言快速到底 平时我们接触到的 Java 对象全都是在内存中的对象(它像磁盘中的一个个文件那样实实在在的存在着),所以它是无法进行 IO 操作或者网络通信的,因为在进行 IO 操作或者网络通信的时候, ...

  9. 详细聊聊 Java序列化和反序列化的作用

    1.序列化和反序列化是什么? 如果你看过某些类的源码或者公司的项目,有一些类是实现 Serializable 接口,同时还要显示指定 serialVersionUID 的值. 例如String类: p ...

最新文章

  1. 使用WindowsLive Writer2012和officeWord2013发布到博客园全面总结
  2. AndroidStudio gradle配置
  3. Nginx负载均衡策略有哪些?知识点总结+面试题解析
  4. 57岁博士,第三次出征太空...
  5. 触摸事件touchevent
  6. fpga 输入信号除了1和0还有别的状态?
  7. 技术要能够变现才有价值
  8. Bug--时区问题导致IDEA连接数据库失败
  9. 自制宿舍门禁,微信小程序蓝牙控制,比指纹更安全~
  10. 基于Python+Django的微博评论热点舆情分析可视化系统的设计与实现-计算机毕业设计选题题目推荐
  11. 正确区分LJMP、AJMP、SJMP、JMP跳转指令
  12. 搬: 含有对象成员指针的类的对象成员指针初始化问题
  13. ajax网页没有办法采集,Ajax网页采集方法(最新) - 八爪鱼采集器
  14. Web前端知识——JavaScript
  15. [CLI应用学习]实践使用GitHub CLI
  16. 基于ZigBee的出租车调度系统
  17. Python数据可视化整理
  18. 关于PCB的机械层和差分布线、RC滤波
  19. 业聚医疗第三次冲刺港交所上市,钱永勋、刘桂祯夫妇为实控人
  20. HI-LINK KT210 Al人脸识别串口通信协议

热门文章

  1. R语言使用dplyr包的arrange函数依据dataframe数据的指定数据列对dataframe进行排序(默认从小到大)
  2. 在IDEA中.ignore插件的安装与使用
  3. JAVA小项目(6)javaSE
  4. 大智慧微信登录不上服务器,小微信,大智慧
  5. 2019 NCTF Re WP
  6. 直播授课在线课堂学习平台的设计与实现nodejs+vue
  7. pyqt+vlc 播放rtsp/rtmp地址并嵌入任意frame中
  8. Word 2010 入门教程【初步认识Word 2010】
  9. Solidworks -2-SW最上面的草图绘制工具栏不见了?
  10. python 数据类型转换 及 字符串 转int 报错处理