细看Java序列化机制
概况
序列化的作用
- 提供一种简单又可扩展的对象保存恢复机制。
- 对于远程调用,能方便对对象进行编码和解码,就像实现对象直接传输。
- 可以将对象持久化到介质中,就像实现对象直接存储。
- 允许对象自定义外部存储的格式。
序列化例子
|
1
2
3
4
5
|
FileOutputStream f = new FileOutputStream("tmp.o"); ObjectOutput s = new ObjectOutputStream(f); s.writeObject("test"); s.writeObject(new ArrayList()); s.flush(); |
反序列化例子
|
1
2
3
4
|
FileInputStream in = new FileInputStream("tmp.o"); ObjectInputStream s = new ObjectInputStream(in); String test = (String)s.readObject(); List list = (ArrayList)s.readObject(); |
serialVersionUID 有什么用
在序列化操作时,经常会看到实现了 Serializable 接口的类会存在一个 serialVersionUID 属性,并且它是一个固定数值的静态变量。比如如下,这个属性有什么作用?其实它主要用于验证版本一致性,每个类都拥有这么一个 ID,在序列化的时候会一起被写入流中,那么在反序列化的时候就被拿出来跟当前类的 serialVersionUID 值进行比较,两者相同则说明版本一致,可以序列化成功,而如果不同则序列化失败。
|
1
|
private static final long serialVersionUID = -6849794470754667710L; |
父类序列化什么情况
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public class Father { public int f; public Father() { } } public class Son extends Father implements Serializable { public int s; public Son() { super(); } } |
哪些字段会序列化
1. 默认方式,Java对象中的非静态和非transient的字段都会被定义为需要序列的字段。
2. 另外一种方式是通过 ObjectStreamField 数组来声明类需要序列化的对象。
|
1
2
3
4
5
6
7
|
public class A implements Serializable { String name; String password private static final ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("name", String.class)}; } |
枚举类型的序列化
Externalizable 接口作用
|
1
2
3
4
5
6
|
public interface Externalizable extends java.io.Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; } |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
public class ExternalizableTest implements Externalizable { public String value = "test"; public ExternalizableTest() { } public void writeExternal(ObjectOutput out) throws IOException { Date d = new Date(); out.writeObject(d); out.writeObject(value); } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { Date d = (Date) in.readObject(); System.out.println(d); System.out.println((String) in.readObject()); } } |
写入时替换对象
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } private Object writeReplace() throws ObjectStreamException { Object[] properties = new Object[2]; properties[0] = name; properties[1] = age; return properties; } } |
|
1
2
|
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.o")); Object[] properties = (Object[]) ois.readObject(); |
读取时替换对象
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } private Object readResolve() throws ObjectStreamException { return 2222; } } |
|
1
2
|
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.o")); Object o = ois.readObject(); |
细看Java序列化机制的更多相关文章
- Java序列化机制
java的序列化机制支持将对象序列化为本地文件或者通过网络传输至别处, 而反序列化则可以读取流中的数据, 并将其转换为java对象. 被序列化的类需要实现Serializable接口, 使用Objec ...
- hadoop序列化机制与java序列化机制对比
1.采用的方法: java序列化机制采用的ObjectOutputStream 对象上调用writeObject() 方法: Hadoop 序列化机制调用对象的write() 方法,带一个DataOu ...
- 输入和输出--java序列化机制
对象的序列化 什么是Java对象的序列化? 对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象.对象序列化机制允许把内存中的Java对象转换成与平台无关的二进制流,从而保存或者传输.其他 ...
- Java序列化机制和原理及自己的理解
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...
- Java序列化机制和原理
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...
- Java序列化机制剖析
本文转载自longdick的博文<Java序列化算法透析>,原文地址:http://longdick.iteye.com Java序列化算法透析 Serialization(序列化)是一种 ...
- Java序列化机制原理
Java序列化就是将一个对象转化为一个二进制表示的字节数组,通过保存或则转移这些二进制数组达到持久化的目的.要实现序列化,需要实现java.io.Serializable接口.反序列化是和序列化相 ...
- Java I/O系统学习系列五:Java序列化机制
在Java的世界里,创建好对象之后,只要需要,对象是可以长驻内存,但是在程序终止时,所有对象还是会被销毁.这其实很合理,但是即使合理也不一定能满足所有场景,仍然存在着一些情况,需要能够在程序不运行的情 ...
- java 序列化机制
package stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io ...
随机推荐
- Mybatis之二级缓存(八)
1. 介绍 Mybatis缓存分为一级缓存和二级缓存,在本节中我们介绍下二级缓存的使用及其特性 MyBatis的一级缓存是在一个Session域内有效的,当Session关闭后,缓存内容也随之销毁.但 ...
- C语言-数组的深入学习
深入学习一下数组1.从内存角度来讲:数组变量就是一次分配多个变量,而且这些变量的地址是连续的,也就是存放这些变量的存储单元是依次相连接的.而且这多个变量必须单独访问,不可以一起访问的.因为他们的地址彼 ...
- Android开发—错误记录1:W/System.err: java.net.ConnectException: Connection refused
W/System.err: java.net.ConnectException: Connection refused 前台访问后台时,出现访问被拒绝情况:W/System.err: java.net ...
- django2:路由path语法
目录 1.问题引入 2.使用示例 3.path转化器 4.自定义转化器 4.1 定义 4.2 注册 5.使用正则表达式 6.Import变动 7.代码改写 8.总结 9月23,Django 发布了2. ...
- UVA 10273
我是用暴力过的,虽然网上说刘汝佳出的这道题考的是堆,我不太懂,..用暴力时间复杂度高一些,但是一样能过 所要注意的就是周期问题,因为只要同时存在某一天超过一头牛产奶量最小,就不会杀牛,而每头牛的周期和 ...
- 单机版solr的搭建
1.1. Solr的环境 Solr是java开发. 需要安装jdk. 安装环境Linux. 需要安装Tomcat. 1.2. 搭建步骤 第一步:把solr 的压缩包上传到Linux系统 第二步:解压s ...
- D - Lis on Circle Gym - 102441D (LIS + 线段树)
There are nn people at the round gaming table. Each of them has a set of cards. Every card contains ...
- macos上命令行查看磁盘序列号
收集到两种命令行获取方法:(另外https://www.maketecheasier.com/find-mac-serial-number/中还说明了GUI模式下的查看方法) 1.system_pro ...
- day61-mysql-索引原理和慢查询优化
ProgramData是C盘隐藏的文件夹,mysql的data文件夹在里面,C:\ProgramData\MySQL\MySQL Server 8.0\Data 一.存储引擎 重点[面试题]: inn ...
- HTML引入文件/虚拟目录/绝对路径与相对路径
此篇引见 相对路径和绝对路径的区别 1.绝对路径 使用方法:而绝对路径可以使用“\”或“/”字符作为目录的分隔字符 绝对路径是指文件在硬盘上真正存在的路径.例如 <body backround= ...