文档章节

Java序列化与反序列化

haoran_10
 haoran_10
发布于 2016/07/15 16:39
字数 1011
阅读 31
收藏 2
  1. 什么是Java序列化与反序列化? 
  2. 为什么需要Java序列化与反序列化?
  3. 怎么Java序列化与反序列化?
  4. 有没有造好的轮子?
  5. 总结

 

1.什么是Java序列化与反序列化? 

序列化:将java对象转换为字节序列的过程叫做序列化

反序列化:将字节对象转换为java对象的过程叫做反序列化

 

2.为什么需要Java序列化与反序列化?

(1)、存储

在java系统运行过程中,java对象只存在于堆栈中,但是一旦系统停止运行了,或者某次交互回话结束后,这些java对象也不存在了,

想要再次获得java对象,则需要从一些存储设备中读取数据,并且还原为原先的java对象,系统才可以再次正常运行。

这里存储设备,可以是文件,缓存(比如EhCache,MemCache,redis等等),甚至是数据库中,都可以,保存这些对象的字节流,等待java对象再次复活!

 

(2)、传输&交换

分布式系统中,系统之间交互,比如通过java原生的RMI远程调用,返回的字节流反序列化为java对象,才能在jvm里运行。

或者当下常用的分布式架构,http+json返回的json数据,也是需要反序列化为java对象,只是用的方法和jdk原生不同罢了,

以及新的分布式架构,thrift,dubbo等,返回的数据是字节流的形式,也是需要反序列化。

3.怎么Java序列化与反序列化?

 java JDK自带的序列化工具有

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

对象序列化一般包括如下步骤:

1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

2) 通过对象输出流的writeObject()方法写对象。

对象反序列化的步骤如下:

1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

2) 通过对象输入流的readObject()方法读取对象

特殊说明下:实现Serializable接口的java对象,有一个serialVersionUID,s​e​r​i​a​l​V​e​r​s​i​o​n​U​I​D​:​ 字​面​意​思​上​是​序​列​化​的​版​本​号​,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量,

同一个java对象只要序列化ID相同,属性相同,那么反序列化会正常的执行

同一个java对象,如果序列化ID不同,属性相同,反序列化都不会成功

因为默认的JDK序列化与反序列化方法要求必须实现Serializable接口,并且序列化ID相同,这时jvm才认可字节流是可以反序列化的,

和json的反序列化则一样(不再详细说明)

 

4.有没有造好的轮子?

java序列化的框架目前也不少,具体实现没来得及一一研究,有基于json反序列化的(GSON,Jackson),有基于字节流实现的(protobuf),以及基于xml等等

 

5.总结

序列化的规则就像一种协议,一种约定一样,序列化的意义在于信息的交换和存储

 

© 著作权归作者所有

共有 人打赏支持
haoran_10
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
私信 提问

暂无文章

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
2
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
4
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部