Java transient使用小结

    xiaoxiao2021-03-25  127

    1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。

    2、被transient关键字修饰的变量不再能被序列化, 一个静态变量不管是否被transient修饰,均不能被序列化

    3、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。

    可看看下面的代码:

    不加transient

    package test; 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; public class Testtransient { private final static String testPath = "D:/test"; public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException{ User user= new User("testUser","111111"); System.out.println("原始数据:"); System.out.println("userId: " + user.getUserName()); System.out.println("password: " + user.getPassword()); ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(testPath)); os.writeObject(user); os.flush(); os.close(); ObjectInputStream is = new ObjectInputStream(new FileInputStream(testPath)); User ruser = (User) is.readObject(); is.close(); System.out.println("从文件恢复:"); System.out.println("userId: " + ruser.getUserName()); System.out.println("password: " + ruser.getPassword()); } } class User implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String userName; private String password; public User(String username,String password){ this.userName = username; this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }运行结果:

    原始数据: userId: testUser password: 111111 从文件恢复: userId: testUser password: 111111

    注意下面:

    class User implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String userName; private transient String password; public User(String username,String password){ this.userName = username; this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }运行结果:

    原始数据: userId: testUser password: 111111 从文件恢复: userId: testUser password: null

    transient修饰的属性不能被序列化,但是这是有前提条件的。

    我们知道在Java中要想让一个类能够实现序列化,可以通过如下两种方法:

    实现Serializable接口,这种情况下,对象的序列化和反序列化都是java自己的机制自动实现的,不需要人为实现;实现Externalizable接口,可以实现writeExternal()和readExternal()这两个方法,完成自己的序列化/反序列化操作;

    transient修饰的属性不能被序列化这句话只在上面的第一种情况下成立,为什么呢?

    因为 如果实现的是Externalizable接口,序列化和反序列化都是自己控制的,不受transient的约束

    参考:

    http://qifuguang.me/2016/06/24/Java-transient关键字解析/

    http://wujuxiang.blog.51cto.com/2250829/430211

    转载请注明原文地址: https://ju.6miu.com/read-24783.html

    最新回复(0)