- 序列化: 将数据结构或对象转换成二进制串的过程
- 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
关于对象序列化与反序列化还有几点需要注意:
- 反序列化无需通过构造器初始化对象;
- 如果使用序列化机制向文件中写入了多个对象,那么取出和写入的顺序必须一致;
- Java对类的对象进行序列化时,若类中存在对象引用(且值不为null),也会对类的引用对象进行序列化。
使用transient
在一些特殊场景下,比如银行账户对象,出于保密考虑,不希望对存款金额进行序列化。或者类的一些引用类型的成员是不可序列化的。此时可以使用transient关键字修饰不想被或者不能被序列化的成员变量。
如果对类的修改确实会导致反序列化失败,则应主动调整serialVersionUID的值。导致类的反序列化失败的修改有以下几种情形:
- 只是修改了类的方法,不会影响反序列化。
- 只是修改了类的static Field或transient Field,不会影响反序列化。
- 修改了类的非static和非transient Field,会影响序列化。
序列化注意事项
关于对象的序列化,总结下注意事项:
- 对象的类名、Field(包括基本类型、数组及对其他对象的引用)都会被序列化,对象的static Field,transient Field及方法不会被序列化;
- 实现Serializable接口的类,如不想某个Field被序列化,可以使用transient关键字进行修饰;
- 保证序列化对象的引用类型Filed的类也是可序列化的,如不可序列化,可以使用transient关键字进行修饰,否则会序列化失败;
- 反序列化时必须要有序列化对象的类的class文件;
- 当通过文件网络读取序列化对象的时候,必需按写入的顺序来读取。
为什么要序列化和反序列化
主要用于存储对象状态为另一种通用格式,比如存储为二进制、xml、json等等,把对象转换成这种格式就叫序列化,而反序列化通常是从这种格式转换回来。
使用序列化主要是因为跨平台和对象存储的需求,因为网络上只允许字符串或者二进制格式,而文件需要使用二进制流格式,如果想把一个内存中的对象存储下来就必须使用序列化转换为xml(字符串)、json(字符串)或二进制(流)
转自:
http://www.cnblogs.com/amunote/p/4171799.html