JAVA关键字transient
转载自http://www.cnblogs.com/liuling/archive/2013/05/05/transient.html
1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。
2、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
3、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。
如下面的例子
package com.kkoolerter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
public class Main implements Serializable {
private static final long serialVersionUID = -5836283489677344417L;
private transient int classValue = 10;
private transient Date date = new Date();
private transient static int staticValue = 10;
public static void main(String[] args) throws Exception {
Main m = new Main();
m.classValue = 11;
Main.staticValue = 11;
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
new File("0xjh000")));
out.writeObject(m);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
new File("0xjh000")));
Main m1 = (Main) in.readObject();
in.close();
System.out.println(m1.classValue);
System.out.println((m1.date == null ? "date is null"
: "date is not null"));
}
}
程序将输出:
0
date is null
这就说明了一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
思考一下下面的例子:
package com.kkoolerter;
import java.io.Externalizable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
public class ExternalizableTest implements Externalizable {
private transient String content = "哈哈~我将会被序列化,不管我是是否被transient关键字修饰";
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(content);
}
@Override
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
content = (String) in.readObject();
}
public static void main(String[] args) throws Exception {
ExternalizableTest et = new ExternalizableTest();
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
new File("ext0000")));
out.writeObject(et);
ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
"ext0000")));
ExternalizableTest et1 = (ExternalizableTest) in.readObject();
System.out.println(et1.content);
out.close();
in.close();
}
}
程序运行后将输出如下结果:
哈哈~我将会被序列化,不管我是是否被transient关键字修饰
这是为什么呢,不是说类的变量被transient关键字修饰以后将不能序列化了吗?
我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若操作的是一个Serializable对象,则所有的序列化将会自动进行,若操作的是 一个Externalizable对象,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。
本文出自 “有思想的代码” 博客,请务必保留此出处http://wujuxiang.blog.51cto.com/2250829/430211
JAVA关键字transient的更多相关文章
- Java关键字transient和volatile小结(转)
Java关键字transient和volatile小结(转) transient和volatile两个关键字一个用于对象序列化,一个用于线程同步,都是Java中比较高阶的话题,简单总结一下. tran ...
- 【JSON 注解】JSON循环引用2----JSON注解@JsonIgnoreProperties+JAVA关键字transient+后台对象与JSON数据的格式互相转化
接着来说这个JSON循环引用的问题: 关于JSON格式的转化,其实关键就是这几个依赖: <!-- json --> <!-- 1号 --> <dependency> ...
- Java关键字:transient,strictfp和volatile简介
关键字:transient 使用对象:字段 介绍:transient说明一个属性是临时的,不会被序列化. 当对象进行序列化(Serializable)过程时候,有一些属性的状态是瞬时的,这样的对象是无 ...
- java 关键字 transient
一个对象实现了Serilizable 接口,该对象就可以被序列化. 然而在实际开发工程中,我们会遇到,这个类的有些属性不需要序列化,比如包含用户的敏感信息(如密码),为了安全起见,不希望在网络操作(主 ...
- java关键字-transient
java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持. Java的serialization提供了一种持久化对象实例的机制.当持久化对象时,可能有 ...
- java 关键字transient
http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口 ...
- 转载:关于java关键字transient
今天在map源码中看到这个关键字 百度看一下 转载记录下 源文:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作 ...
- Java关键字——transient
当使用Serializable接口实现序列化操作时,如果一个对象中的某一属性不希望被序列化,则可以使用transient关键字进行声明 import java.io.File; import java ...
- java关键字transient与volatile小结
本文转自:http://heaven-arch.iteye.com/blog/1160693 transient和volatile两个关键字一个用于对象序列化,一个用于线程同步,都是Java中比较高阶 ...
随机推荐
- jquery如何获得页面元素的坐标值
http://www.cnblogs.com/pansly/archive/2011/05/25/2056222.html jquery如何获得页面元素的坐标值 yulutxt是输入经典语录的输入 ...
- Eclipse上GIT插件EGIT使用
一.安装EGit插件 參考:MyEclipse8.5整合Git 二.EGit配置 配置个人信息 Window > Preferences > Team > Git > Conf ...
- 用Teleport Ultra下载网站全部页面 爬虫
测试case,就是把Commons-FileUpload 的API下载来 上网查的时候我才发现这是一个由很多页面组成的网站,下载起来很麻烦. 怎么办呢?呵呵,一定是有办法的.Teleport ...
- MVC零基础学习整理(一)
1.Mvc程序的启动页的设置:修改程序的Global.asax文件
- 3D 转换
用X.Y.Z分别表示空间的3个维度,三条轴互相垂直.如下图 1.左手坐标系 2.透视(perspective) 电脑显示屏是一个2D平面,图像之所以具有立体感(3D效果),其实只是一种视觉呈现 ,通过 ...
- C#文件读写操作
方法1:使用FileStream读写文件 using System;using System.Collections.Generic;using System.Text;using System.IO ...
- (c#)WinForm遍历所有控件
遍历WinForm中的所有控件,只执行一次以下语句是不行的 foreach (Control ctl in this.Controls) { } 这样只能遍历到第一层控件,子控件是遍历不到的,要想遍历 ...
- 解决OpenWrt多拨刚开机拨号只拨上一次问题
红色标注为需要权限755/etc/ppp/ip-up.d/ip-up: 一旦 PPP 连结建立后, pppd 会找寻 /etc/ppp/ip-up 指令稿 如果这个指令稿存在并且可以执行的话,那么 P ...
- java多线程并发例子
public static void main(String[] args) { for(Thread t:getThreads()){ t.start(); } } public static Th ...
- 二.ubuntu14.04 3D特效设置
一.如果按照第一篇都设置好了(显卡驱动等都已经正常),然后 1.安装CCSM设置管理器 用鼠标点击屏幕左侧Unity程序启动栏中的“Ubuntu软件中心”(有“A”字形的公文包图标), 在弹出的“Ub ...