Transient修饰符的使用
如果一个类没有继承Serilizable接口,那么它就不能被序列化,写入文件的时候会报异常。如果一个类继承了Serilizable接口,那么这个类的所有属性和方法都可以自动被序列化,而现实中我们又希望继承Serilizable的这个类的某些属性不被序列化保存该需要怎么做呢?这时就需要Transient修饰符上场了。总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
public class TransientTest {
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException{
User user = new User("hoojjack", "123456");
System.out.println("name="+user.getName());
System.out.println("password="+user.getPassword());
System.out.println("sex="+User.getSex());
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:\\Users\\joey\\Desktop\\user.txt"));
out.writeObject(user);
out.flush();
out.close();
User.setSex("girl");
ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:\\Users\\joey\\Desktop\\user.txt"));
User u=(User)in.readObject();
in.close();
System.out.println("After name="+u.getName()+" password="+u.getPassword()+" sex="+User.getSex());
}
}
class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient String password;
private static transient String sex="boy";
//private static String sex="boy";
public static String getSex() {
return sex;
}
public static void setSex(String sex) {
User.sex = sex;
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
结果如下:
name=hoojjack
password=123456
sex=boy
After name=hoojjack password=null sex=girl
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。如上面代码上的sex属性,即使加不加Transient修饰,结果都是一样的。
transient使用细节——被transient关键字修饰的变量真的不能被序列化吗?
在Exteralizable类中完全不一样,不管类继承了Serilizable还是被transient修饰的属性,如果没有显示的在exteralWrite中被写入,都不能序列化,请看下面代码:
public class ExternalizableTest implements Externalizable {
private transient String name;
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name);
//out.writeObject(sex);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String)in.readObject();
// sex = (String) in.readObject();
}
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException{
ExternalizableTest test = new ExternalizableTest();
test.setName("hoojjack");
test.setSex("boy");
ObjectOutput o = new ObjectOutputStream(new FileOutputStream("C:\\Users\\joey\\Desktop\\user.txt"));
o.writeObject(test);
ObjectInput in = new ObjectInputStream(new FileInputStream("C:\\Users\\joey\\Desktop\\user.txt"));
ExternalizableTest context = (ExternalizableTest)in.readObject();
System.out.println("name="+context.getName()+" sex="+context.getSex());
}
}
输出结果:
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(序列化)的理解和总结
Transient修饰符的使用的更多相关文章
- transient修饰符的作用
transient修饰符的作用: entity实体类: package com.baidu.entity; import com.fasterxml.jackson.annotation.JsonIg ...
- java transient修饰符
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问. 2)transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被trans ...
- java修饰符——transient
一.背景 上星期去CRM上开发一个功能,该系统里面有自动分页,需要在实体类里加入一个分页变量 // 分页 private PageInfo pageInfo = new PageInfo(); 这个本 ...
- Java 修饰符
Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class classNam ...
- Java的修饰符
转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主 ...
- Java笔记:修饰符
Synchronized 修饰符 Synchronized 关键字声明的方法同一时间只能被一个线程访问.Synchronized 修饰符可以应用于四个访问修饰符. 实例 public synchron ...
- JAVA修饰符
修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class className { // ... } private boolean myFlag; s ...
- Java_修饰符
目录 访问控制修饰符 非访问修饰符 在java中修饰符主要分为两类:++访问修饰符++和++非访问修饰符++ 访问控制修饰符 修饰符 当前类 同一包内 子孙类 其他包 其他包子孙类 public Y ...
- Java基础-访问修饰符
访问修饰符 default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符.使用对象:类.接口.变量.方法. private : 在同一类内可见.使用对象:变量.方法. 注意:不能修饰类( ...
随机推荐
- git 强制刷新,放弃更改
git fetch --all git reset --hard origin/master
- redis配置文件相关
1. 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes daemonize no 2. 当Redis在后台运行时,Redis默认会把pid写入/var/run/red ...
- dubbo开发前戏--ZooKeeper集群部署(3.4.6)
最近在开发dubbo服务的时候一直用的是公司提供的zk平台,因为使用的人太多或者没人维护老是出问题,导致dubbo服务偶尔可以调通,偶尔调不通的情况,所以花点时间自己部署一套,后面出问题还方便看日志排 ...
- 【Leaflet】鼠标提取坐标
map.on('mousemove', function (e) { document.getElementById('info').innerHTML = /* innerHTML 属性设置或返回表 ...
- Linux应急响应入侵排查思路
0x00 前言 当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解 ...
- MongoDB(六)-- 集群搭建
一.集群介绍 sharding通过将数据集分布于多个也称作分片(shard)的节点上来降低单节点的访问压力.每个分片都是一个独立的数据库,所有的分片组合起来构成一个逻辑上的完整意义的数据库.因此,分片 ...
- 【重要】U3D存放本地游戏存档——不同平台载入XML文件的方法——IOS MAC Android
在PC上和IOS上读取XML文件的方式略有差别,经测试,IOS上不支持如下方法载入XML文件: XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load( ...
- 《C++ Primer Plus》16.1 string类 学习笔记
16.1.1 构造字符串程序清单16.1使用了string的7个构造函数.程序清单16.1 str1.cpp---------------------------------------------- ...
- (原)一句mpAudioPolicy->get_input引发的血案
今天分析Android的Audio系统时,对mpAudioPolicy->get_input进行了分析,没想到这一句话的背后如此复杂,简直是一句话引出的血案啊! 分析结果如下:(关于排版:各个变 ...
- Android学习之Handler消息
Android系统规定,一些耗时的操作不能放在UI线程中去执行,这样会报一个ANR错误.所以为了避免该问题,我们需要开启一个新的线程去执行一些耗时操作:开启新的线程,将耗时的操作在新线程里面去执行, ...