transient的理解
2024-08-30 11:40:32
用法解释
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
细节和例外
对象的序列化可以通过实现两种接口来实现:
若实现的是Serializable接口,则所有的序列化将会自动进行,符合上面的规律。
若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
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("test")));
out.writeObject(et); ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
"test")));
et = (ExternalizableTest) in.readObject();
System.out.println(et.content); out.close();
in.close();
}
} //content变量会被序列化吗?是的,运行结果就是:
//是的,我将会被序列化,不管我是否被transient关键字修饰
最新文章
- jQuery初学:find()方法及children方法的区别分析
- JQuery 控制元素显示隐藏
- 如何在Crystal Portlet中正确返回JSON数据给AJAX请求?
- 【JS复习笔记】06 方法
- POJ 1723
- 探究Activity的各回调方法
- DBA 经典面试题(5)
- SpringMVC+Spring3+Hibernate4开发环境的搭建
- HDU 6185 Covering 矩阵快速幂
- java 利用反射构造泛型类
- 从备份文件bak中识别SQL Server的版本
- mysql8操作命令(持续更新)
- Servlet 使用ServletContext共享数据,读取web.xml配置
- Pinyin4j实战
- python 全栈开发,Day28(复习,os模块,导入模块import和from)
- Ajax跨域CORS
- urllib 基础模块
- iOS 建立项目过滤机制 —— 给工程添加忽略文件.gitignore
- Python Tkinter参考资料之(通用控件属性)
- Delphi使用Indy、ICS组件读取网页