越来越喜欢深究java基础了,讲讲 transient 和static 对序列化的影响。废话少说,直接上代码就可以了
1 package serializable; 2 3 import java.io.Serializable; 4 5 public class User implements Serializable { 6 private String name; 7 private transient String password; // 被transient修饰的变量 8 private static String age; 9 10 11 public User() { 12 super(); 13 } 14 15 public String getName() { 16 return name; 17 } 18 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 public String getPassword() { 24 return password; 25 } 26 27 public void setPassword(String password) { 28 this.password = password; 29 } 30 31 public static String getAge() { 32 return age; 33 } 34 35 public static void setAge(String age) { 36 User.age = age; 37 } 38 39 }
1 import java.io.FileInputStream; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.io.ObjectInputStream; 5 import java.io.ObjectOutputStream; 6 7 public class Test { 8 public static void main(String[] args) throws Exception { 9 // User user = new User(); 10 // user.setAge("22"); 11 // user.setName("小明"); 12 // user.setPassword("admin"); 13 // System.out.println(user.getAge()+" "+user.getName()+" "+user.getPassword()); 14 // ObjectOutputStream oos = new ObjectOutputStream(new 15 // FileOutputStream("e:/user.txt")); 16 // oos.writeObject(user); 17 // oos.flush(); 18 // oos.close(); 19 // 20 // ObjectInputStream ois = new ObjectInputStream(new 21 // FileInputStream("e:/user.txt")); 22 // User users = (User) ois.readObject(); 23 // 24 // System.out.println(users.getAge()+" "+users.getName()+" "+users.getPassword()); 25 // User user = new User(); 26 // user.setAge("22"); 27 // user.setName("小明"); 28 // user.setPassword("admin"); 29 // System.out.println(user.getAge()+" "+user.getName()+" "+user.getPassword()); 30 // ObjectOutputStream oos = new ObjectOutputStream(new 31 // FileOutputStream("e:/user.txt")); 32 // 33 // oos.writeObject(user); 34 // oos.flush(); 35 // oos.close(); 36 37 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt")); 38 User users = (User) ois.readObject(); 39 40 System.out.println(users.getAge() + " " + users.getName() + " " + users.getPassword()); 41 42 } 43 }
运行截图贴上
第二次的代码运行截图,一目了然,
从运行结果可以看出用 transient 修饰的变量在反序列化后值为 null
被static修饰的变量应该也是不会被序列化的,因为只有堆内存会被序列化.所以静态变量会天生不会被序列化。也是null.