zoukankan      html  css  js  c++  java
  • java transient 关键字

    Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化,这一看好像很好理解,就是不被序列化,那么什么情况下,一个对象的某些字段不需要被序列化呢?如果有如下情况,可以考虑使用关键字transient修饰:

    1、类中的字段值可以根据其它字段推导出来,如一个长方形类有三个属性:长度、宽度、面积(示例而已,一般不会这样设计),那么在序列化的时候,面积这个属性就没必要被序列化了;

    2、其它,看具体业务需求吧,哪些字段不想被序列化;

    PS,记得之前看HashMap源码的时候,发现有个字段是用transient修饰的,我觉得还是有道理的,确实没必要对这个modCount字段进行序列化,因为没有意义,modCount主要用于判断HashMap是否被修改(像put、remove操作的时候,modCount都会自增),对于这种变量,一开始可以为任何值,0当然也是可以(new出来、反序列化出来、或者克隆clone出来的时候都是为0的),没必要持久化其值。

    为什么要不被序列化呢,主要是为了节省存储空间,其它的感觉没啥好处,可能还有坏处(有些字段可能需要重新计算,初始化什么的),总的来说,利大于弊。

    package tmp;
    
    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("
    height : ");
            sb.append(this.height);
            sb.append("
    area : ");
            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.原始对象
    "+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.反序列化后的对象
    "+rectangle1);
            rectangle1.setArea();
            System.out.println("3.恢复成原始对象
    "+rectangle1);
            in.close();
        }
    }
    

    摘自http://www.cnblogs.com/chenpi/p/6185773.html

  • 相关阅读:
    WebSocket
    Jedis工具类
    电脑突然没有声音了 右下角红叉叉,由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备。 (代码19)
    java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
    WCF中的数据契约(Continued)
    WCF中的服务契约
    搭建基于MOSS的团队解决方案01——Microsoft Office SharePoint 2007 Server快速入门(Continued)
    Silverlight 的发展之路
    Windows Workflow Foundation实验01——Windows Workflow Foundation快速入门(练习四)
    使用.NET平台工具操作Live Framework
  • 原文地址:https://www.cnblogs.com/baxianhua/p/10287839.html
Copyright © 2011-2022 走看看