概况
序列化的作用
- 提供一种简单又可扩展的对象保存恢复机制。
- 对于远程调用,能方便对对象进行编码和解码,就像实现对象直接传输。
- 可以将对象持久化到介质中,就像实现对象直接存储。
- 允许对象自定义外部存储的格式。
序列化例子
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 ...
随机推荐
-
输出 n=6 的三角数字阵(JAVA基础回顾)
package itcast.feng; import java.util.Scanner; //需求:输出 n=6 的三角数字阵 //1 //2 3 //4 5 6 //7 8 9 10 //11 ...
-
.net版本发展历史
最近装上了VS2013,发现好多新特性.新功能,公司办公还在使用VS2005.VS2008,不过用着也很顺手,在最新版Visual Studio中,微软加入了git源码管理工具,和之前的TFS大体上类 ...
-
C#使用Fixed创建固定大小的缓冲区
在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区. 使用现有代码(如使用其他语言.预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用. 固定数组可采用 ...
-
BZOJ 3223 文艺平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 ...
-
hdu4430 枚举+二分
Yukari's Birthday Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
-
mvc 设置默认页技巧
打开网址:http://xxxx.com自动跳转==>http://xxx.com/home/index 设置route入口: routes.MapRoute( name: "Main ...
-
win7 下安装oracle 10 g
首先下对版本,Oracle 10g支持Win7版: http://download.oracle.com/otn/nt/oracle10g/10203/10203_vista_w2k8_x86_pro ...
-
java多态抽象类实例
编写一个Soldier类,描述具有普遍行为和属性的一个士兵对象. 编写陆军士兵.海军士兵.军官类来扩展Soldier类. 设计Soldier类的相关属性和方法. 建模几个陆军士兵.海军士兵.军官类来继 ...
-
JavaScript获取访问设备信息
<html xmlns=http://www.w3.org/1999/xhtml> <head> <title>JavaScript获取访问设备信息</tit ...
-
POI 设置Excel样式(转)
POI 设置Excel样式 POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 先获取工作薄对象: HSSFWorkbook wb = new HSSFWorkbook(); HSSFSh ...