transient、Externalizable
Java transient关键字使用小结
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://www.cnblogs.com/liuling/archive/2013/05/05/transient.html
转载于:https://www.cnblogs.com/yanLog/p/7567263.html
transient、Externalizable相关推荐
- Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释...
转自Hibernate JPA中@Transient.@JsonIgnoreProperties.@JsonIgnore.@JsonFormat.@JsonSerialize等注解解释 1.@Tran ...
- Hibernate三种状态(Transient、Persistent、Detached)各种保存(save,persist,update,saveOrUpdte,merge,flush,lock)区别
转载地址:http://www.2cto.com/kf/201212/178604.html 一.三种状态(Transient.Persistent.Detached) 在Hibernate中有三种状 ...
- Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.@Transient @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将 ...
- java 反射 transient_JAVA 对象序列化(三)——transient以及Externalizable的一种替代方法(使用Serializable)...
transient(瞬时)关键字 当我们队序列化进行控制时,可能某个特定子对象不想让Java的序列化机制自动保存与恢复.如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通常就会面临这种情况 ...
- Java 序列化 transient 、session、cookie
transient使用小结 一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问. transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变 ...
- java serializable用法_JAVA序列化Serializable及Externalizable区别详解
序列化简介 Java 的对象序列化将那些实现 Serializable 接口的对象转换成一个字节序列,并能在之后将这个字节序列完全恢复为原来的对象. 这就意味着 Java 对象在网络上的传输可以不依赖 ...
- java transient关键字_嗯?你真的会用 Java 序列化机制?
码农每日一题长按关注,工作日每天分享一个技术知识点. 一.序列化.反序列化概念及其使用场景 1.序列化.反序列化的概念 简单的讲,序列化就是将java对象转化成二进制保存到磁盘中去,反序列化就是从磁盘 ...
- JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】
黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...
- 【已完结!】Java基础--学习笔记(零起点打开java世界的大门)--博客汇总表【附:视频、工程源码、资料、详细笔记】
java零基础入门到精通(2019版)[黑马程序员] 视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:z ...
最新文章
- 中台辨析:架构的演进趋势
- First day in 聚美
- redis 主从配置_应用 | Redis实现 主从,单例,集群,哨兵,配置应用
- SAP在物流工作中的应用之学习笔记
- 神策数据 App 可视化全埋点 2.0 重磅升级!抢先体验
- Luogu P4708 画画 (Burnside引理、组合计数)
- 通过此注释改善您的JUnit体验
- [转]迭代、集合、字典表和列表
- RTX5 | 线程管理02 - 创建线程(动态堆栈方式)
- SqlServer数据库的常用操作-更新中
- easyui input输入框的限制和校验条件
- ARM处理器指定运行核
- python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径
- 指令级并行——超标量Superscalar与超长指令字VLIW架构
- 解密深圳IT人士的当前薪情【转自:中国it实验室】
- PyCharm怎么来更新pip
- 计算机右键管理是什么软件,右键管理工具打不开怎么办【图文】
- 快圣诞节了,用Python 送你一棵圣诞树
- 笔试加分题:有16瓶水,其中只有一瓶水有毒,小白鼠喝一滴之后一小时会死。请问最少用() 只小白鼠,在1小时内一定可以找出有毒的水?
- “Think Different”是个糟糕的想法
热门文章
- UVA - 699 The Falling Leaves
- [leetcode]240. 搜索二维矩阵 II
- Unity3D基础7:Transform组件
- HDU 6184 2017广西邀请赛:Counting Stars(三元环)
- matlab 求二值图像图形的面积和重心
- gRPC传输协议使用(python教程)
- python机器学习库sklearn——多类、多标签、多输出
- js中DOM, DOCUMENT, BOM, WINDOW 区别
- matlab2c使用c++实现matlab函数系列教程-randn函数
- c#图像处理-图像预览全解