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方法 }
项目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) {} } } } }
项目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方法 }
项目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) {} } } } }
执行结果如下:
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,说明这两个变量并没有被序列化到二进制文件中。