http://www.cnblogs.com/lanxuezaipiao/p/3369962.html
里边用到一个自己写写的测试
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; /** * @description 使用transient关键字不序列化某个变量 * 注意读取的时候,读取数据的顺序一定要和存放数据的顺序保持一致 * * @author Alexia * @date 2013-10-15 */ public class TransientTest { public static void main(String[] args) { User user = new User(); user.setUsername("Alexia"); user.setPasswd("123456"); System.out.println("read before Serializable: "); System.out.println("username: " + user.getUsername()); System.err.println("password: " + user.getPasswd()); try { ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("D:/user.txt")); os.writeObject(user); // 将User对象写进文件 os.flush(); os.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { ObjectInputStream is = new ObjectInputStream(new FileInputStream( "D:/user.txt")); user = (User) is.readObject(); // 从流中读取User的数据 is.close(); System.out.println("\nread after Serializable: "); System.out.println("username: " + user.getUsername()); System.err.println("password: " + user.getPasswd()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } class User implements Serializable { private static final long serialVersionUID = 8294180014912103005L; private String username; private transient String passwd; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } }首先 这个demo打印结果是
password: 123456
username: Alexia
password: null
read after Serializable:
username: Alexia
有点疑惑
为什么首先打印的是password 而不是username;
其次为什么第二个password为什么是null;
她得到这样的结论
原因是这样的 被transient修饰的变量是不能持久化的这样就以为着只是在缓存中加载 这样这个变量取起来就比较快 所以打印的首先是password
关于第二点 正因为是没有被序列化的就导致了写入user.txt的文件里边其实是没有password的内容。
做一点补充
如果User中username被static修饰了会怎么样 如果password被static 修饰了会怎样
结果是username被static修饰结果不变 如果password被static修饰则可以在反序列化的时候取到password
所以关于alexia的一个静态变量不管是否被transient修饰 均不能被序列化 这句话 是站不住脚的。
第二点补充,
在apache的beanMap中通过对对象的进行map封装 得到一个map 用于封装这个map的成员变量都是用 transient 进行修饰的 。如果用httpInvoke获取这个map就会出现无法序列化的错误。我采取的办法是新建一个map 然后对用beanMap对这个map 进行循环插入 把map这个对象通过httpInvoke进行传输。