序列化和反序列化总结
简介
对象的序列化
如上图,我们把一个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不再是梦想!
序列化和反序列化总结相关推荐
- [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- 序列化和反序列化实现
1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯.这个将程序数据转换成能被存储并传输的格式的过程被称 ...
- Json的序列化和反序列化
1.引用命名空间: using System.Runtime.Serialization; 2.json的序列化和反序列化的方法: publicclass JsonHelper { ///<su ...
- C#实现对象的Xml格式序列化及反序列化
要序列化的对象的类: [Serializable] public class Person { private string name; public string Name { get { retu ...
- c语言xml序列化,C# XML和实体类之间相互转换(序列化和反序列化)
我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...
- 十三、序列化和反序列化(部分转载)
json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...
- java培训教程分享:Java中怎样将数据对象序列化和反序列化?
本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...
- K:java中的序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论. Java序列化与反序列化 简单来说Java序列化是指把Java对象转 ...
- json的序列化与反序列化
json 是一种轻量级的数据交换格式,也是完全独立于任何程序语言的文本格式. 本文介绍json字符串的序列化与反序列化问题. 序列化 是指将变量(对象)从内存中变成可存储或可传输的过程. 反序列化 是 ...
- 深入分析Java的序列化与反序列化
阅读目录 Java对象的序列化 如何对Java对象进行序列化与反序列化 序列化及反序列化相关知识 ArrayList的序列化 ObjectOutputStream 总结 序列化是一种对象持久化的手段. ...
最新文章
- php找不到指定的模块,php中的dll“无法找到指定的模块”
- 小师妹学JavaIO之:文件系统和WatchService
- 微信小程序把玩(三)tabBar底部导航
- mysql的配置以及后端数据库的连接
- 写程序实现wireshark的抓包功能
- 【JS教程】100+常用JS函数(方法)
- 文档中某些特定数据查询
- Java中native方法的使用
- sql分组排序取top n
- 老子道德经原文加讲解
- SaltStack组件return和job cache以及salt-ssh
- Java整合腾讯云短信发送
- linux adb arm移植,移植ubuntu core到Arm开发板
- 服务器 微信报警平台,Zabbix实现微信报警
- JavaScript实现React实现网页转换成图片截屏下载
- Jsp页面使用JavaBeans
- 企业风控如何搭建四大体系,实现全局防控?
- UtoVR Player免费360VR视频播放器
- 那些整天脸上都挂着笑容的人,你真的了解他们吗
- 挖掘高流量网站长尾词
热门文章
- python代码:匿名函数lambda、列表解析list comps
- dashboard android,dashboard下载-Dashboard 安卓版v1.2.12-PC6安卓网
- win10显示服务器登录失,win10电脑user profile service服务登录失败怎么办
- 百度智能云与雅量商业智能携手,加速零售行业智能化升级
- Spring之循环依赖源码解析
- 用R画时序图、(偏)自相关图
- windows i0s android,更多阅读:Win10是咋运行安卓/i0S应用的
- python获取域名对应的ip_09python实现DNS查找域名对应的IP地址
- 阿里Java编程规约(命名风格、常量定义、代码格式)
- 桥接模式解密:跨越鸿沟,桥接抽象与实现