当前位置: 首页 > news >正文

Transient修饰符的使用

如果一个类没有继承Serilizable接口,那么它就不能被序列化,写入文件的时候会报异常。如果一个类继承了Serilizable接口,那么这个类的所有属性和方法都可以自动被序列化,而现实中我们又希望继承Serilizable的这个类的某些属性不被序列化保存该需要怎么做呢?这时就需要Transient修饰符上场了。总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

 

 1 public class TransientTest {
 2     
 3     public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException{
 4         User user = new User("hoojjack", "123456");
 5         System.out.println("name="+user.getName());
 6         System.out.println("password="+user.getPassword());
 7         System.out.println("sex="+User.getSex());
 8         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:\\Users\\joey\\Desktop\\user.txt"));
 9         out.writeObject(user);
10         out.flush();
11         out.close();
12         User.setSex("girl");
13         ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:\\Users\\joey\\Desktop\\user.txt"));
14         User u=(User)in.readObject();
15         in.close();
16         System.out.println("After  name="+u.getName()+" password="+u.getPassword()+" sex="+User.getSex());
17     }
18 
19 }
20 
21 class User implements Serializable{
22     private static final long serialVersionUID = 1L;
23     private String name;
24     private transient String password;
25     private static transient String sex="boy";
26     //private static  String sex="boy";
27 
28     public static String getSex() {
29         return sex;
30     }
31 
32 
33     public static void setSex(String sex) {
34         User.sex = sex;
35     }
36 
37 
38     public User(String name, String password) {
39         this.name = name;
40         this.password = password;
41     }
42     
43 
44     public String getName() {
45         return name;
46     }
47 
48     public void setName(String name) {
49         this.name = name;
50     }
51 
52     public String getPassword() {
53         return password;
54     }
55 
56     public void setPassword(String password) {
57         this.password = password;
58     }
59 }

结果如下:
1 name=hoojjack
2 password=123456
3 sex=boy
4 After  name=hoojjack password=null sex=girl

 

1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。

2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。

3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。如上面代码上的sex属性,即使加不加Transient修饰,结果都是一样的。

 

 

transient使用细节——被transient关键字修饰的变量真的不能被序列化吗?

 

在Exteralizable类中完全不一样,不管类继承了Serilizable还是被transient修饰的属性,如果没有显示的在exteralWrite中被写入,都不能序列化,请看下面代码:

 1 public class ExternalizableTest implements Externalizable {
 2 
 3     private transient String name;
 4     private String sex;
 5     
 6     public String getSex() {
 7         return sex;
 8     }
 9 
10     public void setSex(String sex) {
11         this.sex = sex;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public void writeExternal(ObjectOutput out) throws IOException {
23         out.writeObject(name);
24         //out.writeObject(sex);
25         
26     }
27 
28     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
29          name = (String)in.readObject();
30         // sex = (String) in.readObject();
31         
32     }
33     
34     public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException{
35         ExternalizableTest test = new ExternalizableTest();
36         test.setName("hoojjack");
37         test.setSex("boy");
38         ObjectOutput o = new ObjectOutputStream(new FileOutputStream("C:\\Users\\joey\\Desktop\\user.txt"));
39         o.writeObject(test);
40         ObjectInput in = new ObjectInputStream(new FileInputStream("C:\\Users\\joey\\Desktop\\user.txt"));
41         ExternalizableTest context = (ExternalizableTest)in.readObject();
42         System.out.println("name="+context.getName()+" sex="+context.getSex());
43         
44     }
45 
46 }

输出结果:

1 name=hoojjack sex=null

 我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。

 

Reference:

[1] http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

[2] http://blog.csdn.net/dreamtdp/article/details/15378329    对Java Serializable(序列化)的理解和总结

 

转载于:https://www.cnblogs.com/hoojjack/p/6881977.html

相关文章:

  • 【算法】 算法和数据结构绪论
  • 【转】Servlet 生命周期、工作原理
  • Openssl源代码整理学习---含P7/P10/P12说明
  • LeetCode OJ 之 Ugly Number II (丑数-二)
  • [计算机术语]缺省
  • (一)Thymeleaf用法——Thymeleaf简介
  • 【Python】 命名空间与LEGB规则
  • 通用的进程监控脚本process_monitor.sh使用方法
  • Spark on Yarn集群搭建详细过程
  • MySQL学习笔记-数据类型与操作数据表
  • sklearn包学习
  • 转一个简单的vue.js的图片懒加载的插件代码!
  • 学渣的逆袭:他叛逆狂妄,却搞出不少大新闻
  • MySQL 数据库分表分区
  • LVS+keepalived 下部署RTSP负载均衡
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Angular6错误 Service: No provider for Renderer2
  • Brief introduction of how to 'Call, Apply and Bind'
  • go语言学习初探(一)
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • sessionStorage和localStorage
  • vue 个人积累(使用工具,组件)
  • Vue UI框架库开发介绍
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 初探 Vue 生命周期和钩子函数
  • 大数据与云计算学习:数据分析(二)
  • 代理模式
  • 什么软件可以剪辑音乐?
  • 实战|智能家居行业移动应用性能分析
  • 算法-插入排序
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信小程序实战练习(仿五洲到家微信版)
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 【云吞铺子】性能抖动剖析(二)
  • FaaS 的简单实践
  • $(selector).each()和$.each()的区别
  • (04)odoo视图操作
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (python)数据结构---字典
  • (笔试题)分解质因式
  • (二)c52学习之旅-简单了解单片机
  • (附源码)计算机毕业设计高校学生选课系统
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)从 Java 代码到 Java 堆
  • .a文件和.so文件
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET下的多线程编程—1-线程机制概述
  • ?php echo ?,?php echo Hello world!;?