• 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方法。

  • 相关阅读:
    Beta 冲刺(1/7)
    福大软工 · 第十次作业
    11111111
    101
    7
    6
    5
    4
    p
    b2
  • 原文地址:https://www.cnblogs.com/fankongkong/p/11319965.html
Copyright © 2020-2023  润新知