Java关键字-transient

  transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中。

示例:

项目A:序列化对象类

package com.java.serializable;

import java.io.Serializable;

public class Class04 implements Serializable {
    // 序列化ID
    private static final long serialVersionUID = 1L;
    // 昵称
    private String nickName;
    // 关键字transient修饰,该变量无法被序列化
    private transient int age = 26;
    // 关键字transient修饰,该变量无法被序列化
    private transient String sex = "man";
    // 以下省略setter、getter方法
}
View Code

项目A:序列化对象工具类

package com.java.serializable;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class CtestA04 {
    public static void main(String[] args) {
        serializeObjectToFile();
    }
    private static final String PATH = "F:\\objFile.txt";
    // 序列化对象,转换成二进制数据存储到文件objFile.txt
    private static void serializeObjectToFile() {
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream(PATH));
            Class04 classObj = new Class04();
            classObj.setNickName("nickName");
            oos.writeObject(classObj);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(null != oos) {
                try {
                    oos.close();
                } catch (IOException e) {}
            }
        }
    }
}
View Code

项目B:反序列化对象

package com.java.serializable;

import java.io.Serializable;

public class Class04 implements Serializable {
    private static final long serialVersionUID = 1L;
    private String nickName;
    private int age;
    private String sex;
    // 以下省略setter、getter方法
}
View Code

项目B:反序列化对象工具类

package com.java.serializable;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class CtestB04 {

    public static void main(String[] args) {
        reverseSerializeFileToObject();
    }
    // 存储Java对象二进制数据的文件
    private static final String PATH = "F:\\objFile.txt";
    /**
     * 将二进制文件反序列化为java的object对象
     * 
     * 反序列化条件:
     * 1.java类的包名一致
     * 2.java类中变量名,变量类型一致
     * 3.序列化ID一致
     */
    private static void reverseSerializeFileToObject() {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream(PATH));
            Class04 classObj = (Class04) ois.readObject();
            System.out.println("classObj.nickName="+classObj.getNickName());
            System.out.println("classObj.age="+classObj.getAge());
            System.out.println("classObj.sex="+classObj.getSex());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(null != ois) {
                try {
                    ois.close();
                } catch (IOException e) {}
            }
        }
    }
}
View Code

执行结果如下:

System.out.println("classObj.nickName="+classObj.getNickName());// classObj.nickName=nickName;

成员变量nickName,可以正常读取值。

System.out.println("classObj.age="+classObj.getAge());// classObj.age=0
System.out.println("classObj.sex="+classObj.getSex());// classObj.sex=null

使用transient 关键字修饰的成员变量age和sex,值为null,说明这两个变量并没有被序列化到二进制文件中。

猜你喜欢

转载自www.cnblogs.com/517cn/p/10872871.html
今日推荐