参考链接:
Java对象的序列化和反序列化
Java transient关键字使用小记
1. Java序列化概念
把对象转换为字节序列的过程称为对象的序列化;
把字节序列恢复为对象的过程称为对象的反序列化;
作用:对象作为字节序列永久存储在文件中;网络上传输对象的字节序列。
2. JDK中的序列化API
java.io.ObjectOutputStream 表示对象输出流,它的wrteObject(Object
obj)方法可将obj对象进行序列化,把得到的字节序列写入目标输出流中。
java.io.ObjectInputStream 表示对象输入流,它的readObject ()方法从一个源输入流中读取字节序列,再把它们反序列化成一个对象返回。
只有实现了Serializable或是Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
3. serialVersionUID的作用
serialVersionUID: 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。
Java
//默认生成值
private static final long serialVersionUID = 1L;
//根据类名,接口,变量,方法等信息生成的值
private static final long serialVersionUID = 4603642343377807741L;
*作用:*如果我们有需求要在序列化后添加一个字段或者方法。可以自己去指定serialVersionUID。只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法或者属性可以用。
## 4. transient关键字
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
第三点可能有些人很迷惑,因为反序列化后static的值也能够被读出。实际上是这样的:反序列化后类中static型变量username的值为当前JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的.
网友评论