当前位置: 首页 > news >正文

序列化和反序列化总结

简介

在这里插入图片描述

对象的序列化

如上图,我们把一个Person对象以流的方式,写入到文件中保存,叫写对象,也叫对象序列化,对象中包含的不仅仅是字符,使用字节流。

ObjectOutputStream:对象的序列化流

对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。

对象的反序列

把文件中保存的对象,以流的方式读取出来,叫做读取对象,也叫对象的反序列。读取的文件保存的都是字节,使用字节流。

ObjectInputStream:对象的反序列流

关于序列化与反序列化,其实就是将对象从文件中写入(序列化)或者是读取(反序列化),反序列化的时候,我们用Object类来接收,因为Object类可以接收任意对象。

序列化步骤

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

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

◆ 类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。

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

实现序列化步骤

1.声明对象具有可序列化的能力

2.通过Java API实现具体的序列化处理

几个问题

什么情况下需要序列化?

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMI传输对象的时候;

当对一个对象实现序列化时,究竟发生了什么?

在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)

相关注意事项

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

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

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

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

1、安全方面的原因

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

2、资源分配方面的原因

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

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

序列化和外部化的主要区别

序列化会自动存储必要的信息,用以反序列化被存储的实例,而外部化则**只保存被存储的类的标识。**当你通过java.io.serializable接口 序列化一个对象时,**有关类的信息,比如它的属性和这些属性的类型,都与实例数据一起被存储起来。**在选择走externalizable这条路时,java 只存储有关每个被存储类型的非常少的信息。

每个接口的优点和缺点

序列化

优点:

1、内建支持

2、易于实现

缺点:

1、占用空间过大

2、由于额外的开销导致速度变比较慢

外部化

优点:

1、开销较少(程序员决定存储什么)

2、可能的速度提升

缺点:

虚拟机不提供任何帮助,也就是说所有的工作都落到了开发人员的肩上。

如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!

架构殿堂

相关文章:

  • 适配器模式
  • 运行django项目时出错
  • 何为JAVA内部类?
  • 数据库原理中的范式
  • JAVA线程池如何调优
  • 【RF库测试】Variable Should not Exist variable should exist
  • JDK8中为什么移除方法区
  • 对象是否存活,可以这样判断?
  • ETL全量多表同步简述
  • 简洁说明JVM内存区域(运行时数据区)
  • python学习day1--python基础
  • 你了解垃圾收集算法吗?
  • 【Oracle】Oracle的内外连接
  • libpng warning: iCCP: cHRM chunk does not match sRGB
  • 真香,手写一个简易redis
  • $translatePartialLoader加载失败及解决方式
  • 【391天】每日项目总结系列128(2018.03.03)
  • Android组件 - 收藏集 - 掘金
  • Docker: 容器互访的三种方式
  • ES6之路之模块详解
  • jquery ajax学习笔记
  • Making An Indicator With Pure CSS
  • PHP 的 SAPI 是个什么东西
  • PHP变量
  • Redis 中的布隆过滤器
  • Redis在Web项目中的应用与实践
  • tab.js分享及浏览器兼容性问题汇总
  • Yeoman_Bower_Grunt
  • 不上全站https的网站你们就等着被恶心死吧
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 成为一名优秀的Developer的书单
  • 大型网站性能监测、分析与优化常见问题QA
  • 好的网址,关于.net 4.0 ,vs 2010
  • 如何用vue打造一个移动端音乐播放器
  • 通过调用文摘列表API获取文摘
  • # Maven错误Error executing Maven
  • #DBA杂记1
  • #if #elif #endif
  • (c语言)strcpy函数用法
  • (独孤九剑)--文件系统
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)四层和七层负载均衡的区别
  • (转)一些感悟
  • .form文件_一篇文章学会文件上传
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @RequestMapping用法详解
  • @Resource和@Autowired的区别
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AR]Vumark(下一代条形码)
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [bzoj4240] 有趣的家庭菜园