Java教程

Java中的transient关键字

本文主要是介绍Java中的transient关键字,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.transient关键字的作用和使用方法

  1. transient关键字的作用:一个类实现了Serializable接口,这个类定义的对象就可以序列化和反序列化。不需要序列化的属性加上transient关键字修饰。
  2. transient关键字只能修饰变量,不能修饰方法和类。
  3. transient关键字使用示例:
// 密码信息作为敏感信息,为了安全起见,不需要序列化

// 实现Serializable接口,支持序列化和反序列化
public class User implements Serializable {
    private String userName;
    private transient String password;
    // get,set
}

public class TransientTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User();
        user.setUserName("root");
        user.setPassword("123456");

        //序列化前:root,123456
        System.out.println("序列化前:" + user.getUserName() + "," + user.getPassword());


        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.txt"));
        // 将对象序列化文件里
        outputStream.writeObject(user);
        outputStream.flush();

        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.txt"));
        // 从流中读取数据
        User object = (User) inputStream.readObject();

        // 序列化后root,null
        System.out.println("序列化后" + object.getUserName() + "," + object.getPassword());
        
        inputStream.close();
        outputStream.close();
    }
}
  1. 如何序列化被transient关键字修饰的类变量:实现Externalizable接口.
  2. 被static修饰的类变量不管是否使用transient关键字修饰,都是不能被序列化的。
//反序列化后类中static型变量的值实际上是当前JVM中对应static
//变量的值,这个值是JVM中的并不是反序列化得出的

public class User implements Serializable {
    private String userName;
    private static String password;
    // set,get
}

public class TransientTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User();
        user.setUserName("root");
        user.setPassword("123456");

        //序列化前:root,123456
        System.out.println("序列化前:" + user.getUserName() + "," + user.getPassword());


        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.txt"));
        // 将对象序列化文件里
        outputStream.writeObject(user);
        outputStream.flush();

        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.txt"));
        // 测试静态的password属性是否被序列化
        user.setPassword("root");
        // 从流中读取数据
        User object = (User) inputStream.readObject();

        // 序列化后root,root
        System.out.println("序列化后" + object.getUserName() + "," + object.getPassword());

        inputStream.close();
        outputStream.close();
    }
}

  1. final关键字修饰的变量如果不使用transient关键字修饰,也参与序列化
这篇关于Java中的transient关键字的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!