• transient关键字小结


    1.transient关键字

     在对象序列化时使用,用来修饰不想被序列化的属性。不能用来修饰类和方法,静态变量不管是否被修饰都不能被序列化。

     

    public class User implements Serializable{
        
        /**
         * 测试用
         */
        private static final long serialVersionUID = -2156547593289371682L;
    
        private static String userName;
        
        private transient Integer age;
        
        private int weight;
        
        private transient static String gender;
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public int getWeight() {
            return weight;
        }
    
        public void setWeight(int weight) {
            this.weight = weight;
        }
    
        
    
        
    }
    public class MyTest {
        
        @Test
        public void transientTest(){
            User user=new User();
            user.setUserName("cc");
            user.setAge(16);
            user.setWeight(100);
            user.setGender("man");
            System.out.println("userName"+user.getUserName());
            System.out.println("age:"+user.getAge());
            System.out.println("weight:"+user.getWeight());
            System.out.println("gender"+user.getGender());
            System.out.println("----------");
            try {
                ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
                /**将对象写入文件*/
                oos.writeObject(user);
                oos.flush();
                oos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                ObjectInputStream ois=new ObjectInputStream(new FileInputStream("e:/user.txt"));
                user=(User)ois.readObject();
                ois.close();
                System.out.println("userName:"+user.getUserName());
                /**age字段添加了tansient后不被写入序列化文件*/
                System.out.println("age:"+user.getAge());
                System.out.println("weight:"+user.getWeight());
                System.out.println("gender:"+user.getGender());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    测试结果:

      

      

      只有weight属性被序列化了,控制台中输出的静态变量全是当前JVM中变量对应的值.

      

    public class ExternalizableTest implements Externalizable{
        
        private transient String test="序列化啦!!!";
        
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeObject(test);
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException,
                ClassNotFoundException {
            test=(String)in.readObject();
        }
        
        public static void main(String[] args) {
            ExternalizableTest et=new ExternalizableTest();
            try {
                ObjectOutput oo=new ObjectOutputStream(new FileOutputStream("e:/exTest.txt"));
                oo.writeObject(et);
                ObjectInput oi=new ObjectInputStream(new FileInputStream("e:/exTest.txt"));
                et=(ExternalizableTest) oi.readObject();
                System.out.println(et.test);
                oo.close();
                oi.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        
        
        
    
    }

      若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。

  • 相关阅读:
    _DataStructure_C_Impl:图的邻接矩阵存储
    ios的单元測试OCUnit以及更新了之后的XCTestCase
    java之 ------ 可变參数和卫条件
    【能力提升】SQL Server常见问题介绍及高速解决建议
    NYOJ 116 士兵杀敌 (线段树,区间和)
    Spring和MyBatis环境整合
    TypeScript和JavaScript的一些小技巧记录
    VSCode配置TypeScript
    function 与 => 的区别
    Egret里用矢量挖圆形的洞
  • 原文地址:https://www.cnblogs.com/rookie404/p/5869952.html
Copyright © 2020-2023  润新知