Java 序列化

作者: 环球探测 | 来源:发表于2016-03-20 17:30 被阅读91次

    参考链接:
    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的作用

    s​e​r​i​a​l​V​e​r​s​i​o​n​U​I​D​:​ ​字​面​意​思​上​是​序​列​化​的​版​本​号​,凡是实现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中的不是反序列化得出的.

    相关文章

      网友评论

        本文标题:Java 序列化

        本文链接:https://www.haomeiwen.com/subject/brqklttx.html