序列化相关认识

序列化的意义

?将内存中的对象,以字节码形式存储起来,等待用时反序列化回来,主要是IO操作,可以有更长的生命周期和跨项目性质的作用。

序列化和反序列化

序列化:将对象的信息转化为字节码的形式存储或传输的过程,称为序列化。

public class Person{

private String name;

public void setName(String name){

this.name = name

}

public String getName(){

return name;

}

}

Person person = new Person();

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("person.txt")));

oos.writeObject(person);

?反序列化:序列化的逆向过程,将字节码读取转化为对象的过程,称为反序列化。

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("person.txt")));

Person person = (Person) ois.readObject();

如何实现序列化

在java中只要一个类实现了java.io.Serializable 接口,那么它就可以被序列化

基于JDK序列化方式实现

JDK提供了Java对象的序列化方式,主要通过输出流 java.io.ObjectOutputStream 和 对象输入流 java.io.ObjectInputStream 来实现。其中,被序列化的对象需要 实现java.io.Serializable接口

序列化的问题

序列化的实现方式优劣指标:

序列化后的数据大小

序列化操作的速度以及系统开销

Java序列化的缺点:

序列化后的数据比较大

其他语言无法识别和对接

深入理解序列化

JDK序列化中serialVersionUID的作用:

Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID与本地相应实体类的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException

如果没有为指定的 class 配置 serialVersionUID,那么 java 编译器会自动给这个 class 进行一个摘要算法,类似于指纹算法,只要这个文件有任何改动,得到的 UID 就会截然不同的,可以保证在这么多类中,这个编号是唯一的

serialVersionUID生成规则

默认的1L,比如:private static final long serialVersionUID = 1L;

根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段

当 实 现 java.io.Serializable 接 口 的 类 没 有 显 式 地 定 义 一 个serialVersionUID 变量时候,Java 序列化机制会根据编译的 Class 自动

生成一个 serialVersionUID 作序列化版本比较用,这种情况下,如果Class 文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释等等),就算再编译多次,serialVersionUID 也不会变化的。

静态变量序列化

?序列化时并不保存静态变量,序列化保存的是对象的状态,静态变量属于类的状态,因此序列化并不保存静态变量。

父类序列化问题

?子类实现了Serializable接口,父类未实现,在子类中调用父类属性赋值,序列化过程中出现的情况

若父类未实现Serializable,在反序列化中,无法获取赋值给父类属性值。

父类实现Serializable,则子类无需再次实现Serializable接口,自动实现序列化

如果一个可序列化的类的成员不是基本类型,也不是String类型,那这个引用类型也必须是可序列化的;否则,会导致此类不能序列化。

Transient关键字

?使用transient修饰的属性,java序列化时,会忽略掉此字段,所以反序列化出的对象,被transient修饰的属性是默认值。对于引用类型,值是null;基本类型,值是0;boolean类型,值是false,初始值。

重复序列化问题

?Java序列化同一对象,并不会将此对象序列化多次得到多个对象

?Java序列化算法:

所有保存到磁盘的对象都有一个序列化编码号

当程序试图序列化一个对象时,会先检查此对象是否已经序列化过,只有此对象从未(在此虚拟机)被序列化过,才会将此对象序列化为字节序列输出。

如果此对象已经序列化过,则直接输出编号即可。当写入文件为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,上面增加的5字节的存储空间就是新增 引用和一些控制信息的空间。反序列化时,恢复引用关系,该存储规则极大的节省了存储空间。

可以作为深度克隆

?Java的拷贝一般都是实现Cloneable接口,并重写clone方法进行拷贝操作,主要是对象表皮复制了一份,内部属性的对象引用未改变。

属性类型是基本数据类型或者String字符串类型不影响。

?针对拷贝时对象属性引用问题有几种解决方式

可以在对象属性字段的对象也加上实现Cloneable接口调用clone(比较麻烦),如下:

@Override

public Object clone() throws CloneNotSupportedException {

Teacher teacher = (Teacher) super.clone();

//把引用类型的变量在克隆一份

teacher.setStudent((Student) teacher.getStudent().clone());

return teacher;

}

可以利用序列化的方式,将对象转化为字节流,再转化回对象,做个中转(可能稍微有点麻烦,但非常实用),如下:

public Object copyObject(Object object) throws IOException, ClassNotFoundException {

//创建字节数组输出流将索要拷贝对象写入

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

//创建对象输出流将字节数组输出流传入直接将对象写入字节输出流

ObjectOutputStream objectOutputStrea = new ObjectOutputStream(byteArrayOutputStream);

objectOutputStrea.writeObject(object);

//将刚写入的输出流转化为字节数组传入字节数组输入流

ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());

//对象输入流包装读取为一个对象

ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);

return objectInputStream.readObject();

}

还有可以使用JSON的方式,先将对象转为json,再转回对象,这是不错的想法

常见的序列化技术

Java JDK序列化:简单方便,但是不能跨语言,以及数据量大

XML序列化:可能是通用、阅读好吧(个人不喜欢),缺点比较明显,效率低,数据大

JSON序列化:比较轻量级,数据量小,阅读性高,比较通用(个人比较推荐),主要有(Jackson、FastJson、GSON等)

Hessian 序列化框架:Hessian是一个支持跨语言传输的二进制序列化协议,相对于Java默认的序列化机制来说,Hessian具有更好的性能和易用性,而且支持对重不同的语言,实际上Dubbo采用的就是Hessian序列化来实现,只不过Dubbo对Hessian进行重构,性能更高

Protobuf 序列化框架:个人认为这个和JSON没啥太大差别,只是比JSON更加浓缩,数据格式简洁、量少、但是对对象的支持不太好,若是有解析框架都好说,主要注重RPC传输的数据格式。

序列化速度快的原因:编码 / 解码 方式简单(只需要简单的数学运算 = 位移等等),采用特殊方式标记,更加紧凑

?

原文:https://www.cnblogs.com/zhouguanglin/p/14429031.html

java 序列化理解_Java序列化的相关认知相关推荐

  1. java序列化流_java 序列化流与反序列化流

    一 对象序列化流ObjectOutputStream ObjectOutputStream 将Java对象的基本数据类型和图形写入OutputStream.可以使用ObjectInputStream ...

  2. java序列化层数_java序列化详解

    一.java序列化与反序列化 序列化是指把java对象(属性)转换为字节序列的过程 反序列化是指把字节序列恢复为java对象的过程 二.为什么需要序列化和反序列化 首先网络通信都是二进制的形式在传输, ...

  3. java string 反序列化_java序列化和反序列化

    引语: 平时我们在运行程序的时候,创建的对象都在内存中,当程序停止或者中断了,对象也就不复存在了.如果我们能将对象保存起来,在需要使用它的时候在拿出来使用就好了,并且对象的信息要和我们保存 时的信息一 ...

  4. java 序列化 例子_Java序列化和反序列化例子

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段.@H_502_1@ 编程之家小编现在分享给大家,也给大家做个参考.@H_502_1@ /** * 对象序列化与反序列化 * */ impor ...

  5. java 操作序列_JAVA序列化操作详解

    一.概述 很多时候我们需要将对象的信息以文件的形式存储到硬盘上以便以后可以恢复使用.我们可以按照一定的格式将变量的值依次写到特定格式的文件中.但有时候我们希望只有我们自己可以读懂它并且修改它,这就是序 ...

  6. java序列化原理_Java序列化机制和原理

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

  7. java序列化 反序列化_Java序列化– Java序列化

    java序列化 反序列化 Serialization in Java was introduced in JDK 1.1 and it is one of the important feature ...

  8. java protostuff 好处_Java 序列化框架性能对比(kryo、hessian、java、protostuff)

    简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf 需静态编译 Protostuff-Ru ...

  9. java list反序列化_java序列化与反序列化操作实例分析

    本文实例分析了java序列化与反序列化操作.分享给大家供大家参考,具体如下: 概述: Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程. ...

  10. java serializable用法_JAVA序列化Serializable及Externalizable区别详解

    序列化简介 Java 的对象序列化将那些实现 Serializable 接口的对象转换成一个字节序列,并能在之后将这个字节序列完全恢复为原来的对象. 这就意味着 Java 对象在网络上的传输可以不依赖 ...

最新文章

  1. 在ComboBox控件中使用嵌入字体。
  2. CentOS 初体验十:文件权限查看和修改
  3. 计算机科学计算第二版第四章,大连理工大学 计算机科学计算 第四章2.pdf
  4. 计算机组成比作人的什么位置,理学第章计算机组成上.ppt
  5. pd调节规律_pid算法原理及调整规律解析
  6. C#.NET验证码智能识别学习笔记---04C#.Net图片操作
  7. const关键字在c语言的作用,C语言const关键字作用
  8. AutoPager的简单实现
  9. Ubuntu 串口权限问题
  10. 【归纳】C语言基础知识回顾
  11. CSS综合案例——淘宝焦点图(轮播图)布局及网页布局总结
  12. CRM——销售与客户
  13. winRAR去广告版
  14. Qt点击按钮两次才弹出菜单如何解决
  15. VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard
  16. C#Winform实现手写录入签名与保存为透明png图片
  17. 北京大学计算机同等学力申硕信息平台,北京大学同等学力申硕有哪些专业?
  18. 随机生成20以内加减法,5次答题并统计正确和错误题数
  19. 线性代数常用名词详解1
  20. 计算机内存怎么与频率匹配,怎么算cpu与内存频率匹配

热门文章

  1. 重置网络命令win7
  2. 查看电脑连接的wifi密码
  3. 常见电子元器件的分类与识别
  4. VM虚拟机安装及使用
  5. 一起变装吧服务器维护,2020年1月16日维护预览
  6. 分组背包+树形DP(BY LPX)
  7. 卖计算机英语对话,英语购买电脑情景对话.doc
  8. 学计算机专业开学要买笔记本电脑吗,大一开学需要买电脑吗 大学开学电脑买什么好...
  9. aloha协议c语言实现,任务ALOHA协议的OPNET仿真.doc
  10. Android studio中assets文件更换之后不生效