博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
transient关键字
阅读量:5011 次
发布时间:2019-06-12

本文共 2923 字,大约阅读时间需要 9 分钟。

在看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     @Override55     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     @Override81     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 }

 

转载于:https://www.cnblogs.com/tljava/p/8016672.html

你可能感兴趣的文章
windows 中的类似于sudo的命令(在cmd中以另一个用户的身份运行命令)
查看>>
java===单类设计模式之饿汉式与懒汉式
查看>>
BZOJ 1083: [SCOI2005]繁忙的都市
查看>>
Maven 编译
查看>>
《学习之道》第十章学习方法29还记得散步的好处嘛
查看>>
Git常用命令总结
查看>>
iOS获取设备IP地址
查看>>
JavaSE| String常用方法
查看>>
NRF51822配对绑定要点
查看>>
C语言博客作业—数据类型
查看>>
[leetcode]Count and Say
查看>>
cookie、session和token的概念入门
查看>>
保护网站页面内容+版权
查看>>
Golang模拟客户端POST表单功能文件上传
查看>>
重启进程
查看>>
js 进度条效果
查看>>
RelativeLayout
查看>>
注意细节
查看>>
currying 柯里化,返回函数
查看>>
ASP.NET WebForm(MVC)下实现消息推送(提供简单Demo下载)
查看>>