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 : 在同一类内可见.使用对象:变量.方法. 注意:不能修饰类( ...
随机推荐
- Android开发学习笔记-自定义TextView属性模版
如果项目中有很多个控件使用的是同一种样式,则为了方便,可以将样式设置到系统中去,这样使用的时候会方便很多. 下面是自定义样式模版的方法. 1.在style.xml文件中添加自己要设置的样式内容 < ...
- 浏览器端Less
摘要: 之前项目用过Less,现在负责的项目也要使用,所以就总结下Less,也方便以后查看.本文主要是讲浏览器端如何使用Less. 简介: LESS是一种由Alexis Sellier设计的动态层叠样 ...
- rpc框架thrift
跨语言的rpc框架 新建一个thrift文件 # ping service demoservice PingService { string ping(), ping函数的返回类型是字符串} serv ...
- FileSaver.js 浏览器导出Excel文件
限制一:不同浏览器对 blob 对象有不同的限制 具体看看下面这个表格(出自 FileSaver.js): Browser Constructs as Filenames Max Blob Size ...
- c# 匿名反序列化
1.先new一个匿名对象,然后再反序列化好处是能点点点,坏处是得先new匿名对象 2.借用Newtonsoft.Json.Linq.JObject.Parse,好处是不需要new匿名对象,坏处是不能点 ...
- 大杂烩 -- Iterator 和 Iterable 区别和联系
基础大杂烩 -- 目录 用Iterator模式实现遍历集合 Iterator模式是用于遍历集合类的标准访问方法.它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构. 例 ...
- RF根据单个/多个output文件重新生成log和report文件
场景1:根据单个output文件重新生成log和report文件命令: rebot -d 日志和报告文件保存路径 output.xml文件 场景2:合并两个不同路径下的output文件并生成新的lo ...
- Linux ab 命令
ab 是一个性能测试工具,用来测试一个页面每秒钟能处理多少HTTP请求 [root@localhost ~]$ yum install -y httpd-tools # 安装ab工具 [root@lo ...
- python对oracle数据库的操作
1 Oracle数据库 1.1 Oracle环境配置&客户端连接 1.1.1 下载安装Oracle绿色版客户端instantclient: 到o ...
- 新唐ISP操作步骤(转)
1,电脑上装上“NuMicro_ICP_Programming_Tool_v1.18.5320.zip”:2,把目标板通过SWD口的NU-LINK连接到电脑的USB口上:3,打开桌面的“NuMicro ...