transient关键字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了transient关键字相关的知识,希望对你有一定的参考价值。

在看java.util.ArrayList这个类的源码时,发现其中有个成员变量Object[] elementData 被transient修饰了。突然脑袋回忆不起这个关键字的具体用法了,只知道被此关键字修饰的成员变量不会被序列化。于是我查阅了一下资料。

  当一个类实现了Serializable接口后,那么他就是可被序列化的。一个继承了可序列化类的类本身也是可别序列化的。(源码描述:

  Serializability of a class is enabled by the class implementing the java.io.Serializable interface. All subtypes of a serializable class are themselves serializable.

) 

  在一个可被序列化的类中:

  1.transient只能修饰成员变量/类变量,被它修饰的成员变量将不能被序列化(类变量无论是否被transient修饰都无法被序列化)

  2.如果成员变量是自定义对象类型,那么也必须是可序列化的。如果不是,则可以通过transient修饰,否则会报java.io.NotSerializableException异常。

 测试: 

 1 package com.test;
 2 import java.io.*;
 3 public class TestTransient {
 4 
 5     public static void main(String[] args) throws IOException, ClassNotFoundException {
 6         User user = new User();
 7         user.setPassword("password");
 8         user.setUsername("jery");
 9         person p = new person();
10         p.setName("tom");
11         p.setAge(12);
12         user.setPerson(p);
13 
14         ByteArrayOutputStream bos = new ByteArrayOutputStream();
15         ObjectOutputStream os = new ObjectOutputStream(bos);
16         os.writeObject(user);
17         // user.setUsername("yiiiy"); 测试username被static修饰后,是否会被序列化
18         byte[] bytes = bos.toByteArray();
19         ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(bytes));
20         User u = (User) is.readObject();
21         System.out.println(u);
22     }
23 }
24 
25 class User implements Serializable{
26     private String username;
27     private String password;
28     transient person person;
29 
30     public com.common.util.person getPerson() {
31         return person;
32     }
33 
34     public void setPerson(com.common.util.person person) {
35         this.person = person;
36     }
37 
38     public String getUsername() {
39         return username;
40     }
41 
42     public void setUsername(String username) {
43         this.username = username;
44     }
45 
46     public String getPassword() {
47         return password;
48     }
49 
50     public void setPassword(String password) {
51         this.password = password;
52     }
53 
54     @Override
55     public String toString() {
56         return "User{" +
57                 "username=‘" + username + ‘\‘‘ +
58                 ", password=‘" + password + ‘\‘‘ +
59                 ", person=" + person +
60                 ‘}‘;
61     }
62 }
63 
64 class person{
65     private String name;
66     private Integer age;
67 
68     public String getName() {
69         return name;
70     }
71 
72     public void setName(String name) {
73         this.name = name;
74     }
75 
76     public Integer getAge() {
77         return age;
78     }
79 
80     @Override
81     public String toString() {
82         return "person{" +
83                 "name=‘" + name + ‘\‘‘ +
84                 ", age=" + age +
85                 ‘}‘;
86     }
87 
88     public void setAge(Integer age) {
89         this.age = age;
90     }
91 }

 

以上是关于transient关键字的主要内容,如果未能解决你的问题,请参考以下文章

使用transient关键字解决ehcache序列化错误

@Transient 注解对方法意味着啥?

@Transient 注解、@org.springframework.data.annotation.Transient 注解、transient 关键字和密码存储

Java transient和volatile关键字

Java transient 关键字

Java transient关键字使用小结