美文网首页
java的关键字transient

java的关键字transient

作者: 尘埃里的玄 | 来源:发表于2020-08-27 19:56 被阅读0次
    今天在看jdk的priorityQuene的源码发现了一个陌生的关键字,之前没怎么用过--transient。
    

    Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化,这一看好像很好理解,就是不被序列化,那么什么情况下,一个对象的某些字段不需要被序列化呢?如果有如下情况,可以考虑使用关键字transient修饰:
    1、类中的字段值可以根据其它字段推导出来,如一个长方形类有三个属性:长度、宽度、面积(示例而已,一般不会这样设计),那么在序列化的时候,面积这个属性就没必要被序列化了;
    2、其它,看具体业务需求吧,哪些字段不想被序列化

    顺便说一下什么是java的序列化和反序列化:在讨论transient之前,有必要先搞清楚Java中序列化的含义:
    Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。
    当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。

    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    class Rectangle implements Serializable{
    
        /**
         *
         */
        private static final long serialVersionUID = 1710022455003682613L;
        private Integer width;
        private Integer height;
        private transient Integer area;
    
    
    
        public Rectangle (Integer width, Integer height){
            this.width = width;
            this.height = height;
            this.area = width * height;
        }
    
        public void setArea(){
            this.area = this.width * this.height;
        }
    
        @Override
        public String toString(){
            StringBuffer sb = new StringBuffer(40);
            sb.append("width : ");
            sb.append(this.width);
            sb.append("\nheight : ");
            sb.append(this.height);
            sb.append("\narea : ");
            sb.append(this.area);
            return sb.toString();
        }
    }
    
    public class TransientExample{
        public static void main(String args[]) throws Exception {
            Rectangle rectangle = new Rectangle(3,4);
            System.out.println("1.原始对象\n"+rectangle);
            ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("rectangle"));
            // 往流写入对象
            o.writeObject(rectangle);
            o.close();
    
            // 从流读取对象
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("rectangle"));
            Rectangle rectangle1 = (Rectangle)in.readObject();
            System.out.println("2.反序列化后的对象\n"+rectangle1);
            rectangle1.setArea();
            System.out.println("3.恢复成原始对象\n"+rectangle1);
            in.close();
        }
    }
    

    运行结果:

    width : 3
    height : 4
    area : 12
    2.反序列化后的对象
    width : 3
    height : 4
    area : null
    3.恢复成原始对象
    width : 3
    height : 4
    area : 12
    

    因为area是根据width和height计算出来的值,没有必要序列化。

    相关文章

      网友评论

          本文标题:java的关键字transient

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