Java序列化

1、什么是序列化                                

把对象转换为字节流的过程。

2、什么是反序列化     

把字节流恢复为对象的过程。

3、序列化的作用

1) 把对象的字节流永久地保存到硬盘上,持久化对象;

2) 在网络上传送对象的字节流,传输数据。

4、JDK中的序列化API

1) ObjectOutputStream,writeObject(Object obj)方法;

2)ObjectInputStream,readObject()方法。

5、什么时候需要序列化

当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。

Serializable接口里面什么内容都没有,我们可以将它理解成一个标识接口

6、序列化接口

在Java中的这个Serializable接口其实是给jvm看的,通知jvm,我不对这个类做序列化了,你(jvm)帮我序列化就好了。

Serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

7、序列化的serialVersionUID

serialVersionUID能够让一个对象在反序列化时确定对象的版本,

只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法或者属性可以用。如果我们在序列化时指定的serialVersionUID和反序列化时的不一样,就会抛出异常java.io.InvalidClassException。

如果一个类实现了Serializable接口,在代码中没有声明serialVersionUID,那么系统会为该类生成一个默认的serailVersionUID。

但是java源码的注释中强烈建议 需要为类定义一个serialVersionUID,因为不同的系统编译器可能生成默认的serialVersionUID不一样,从而导致反序列化失败,出现InvalidClassException。

8、序列化的transient关键字

transient关键字用户告诉jvm不需要为该字段进行序列化,即不保存该值。通常用于密码或者特殊字段。

static 修饰的静态变量不是对象状态的一部分,因此它不参与序列化。所以将静态变量声明为transient变量是没有用处的。

final变量将直接通过值参与序列化,所以将final变量声明为transient变量不会产生任何影响。

10、序列化transient修改的关键字

如果需要把设置的 transient 的字段也需要序列化和发序列化,如我们需要对密码加密序列化,反序列化后解密处理,又应该怎么做?

readObject 和 writeObject。

9、举例

输出结果中salary为0,因为被transient关键字修饰,不会被序列化,序列化的时候保存为默认值。

如果我们想序列化salary,那么就实现readObject和writeObject方法。

原文地址:https://www.cnblogs.com/fankongkong/p/11319965.html