java的serialization提供了一个非常棒的存储对象状态的机制,说白了serialization就是把对象的状态存储到硬盘上去,等需要的时候就可以再把它读出来使用。但是在存储对象状态时,我们有时候会需要特定的对象数据在serialization时不进行存储。这时候transient关键字就派上用场了。要关掉类的特定的数据域,可以使用transient关键字进行定义,这对于底层的java虚拟机来说,这个transient类型的变量不是一个类的永久性的状态。
以下是进行transient关键字的实验代码:
import .*;
import .*;
public class LoggingInfo implements
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
LoggingInfo(String user, String password)
{
uid = user;
pwd = password;
}
public String toString()
{
String password=null;
if(pwd == null)
{
password = "NOT SET";
}
else
{
password = pwd;
}
return "logon info: /n " + "user: " + uid +
"/n logging date : " + () +
"/n password: " + password;
}
public static void main(String args[]){
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
(());
try
{
ObjectOutputStream o = new ObjectOutputStream(
new FileOutputStream(""));
(logInfo);
();
}
catch(Exception e) {//deal with exception}
("hello world !");
}
try
{
ObjectInputStream in =new ObjectInputStream(
new FileInputStream(""));
LoggingInfo logInfo1 = (LoggingInfo)();
(());
}
catch(Exception e) {
//deal with exception
}
}
}
生成了文件,是用来serialization进行存放类对象数据的,进行存储后又对这个文件进行读,读的内容如下为第二个logon info后面的内容。
输出结果如下:
logon info:
user: MIKE
logging date : Mon Oct 30 21:39:58 CST 2006
password: MECHANICS
logon info:
user: MIKE
logging date : Mon Oct 30 21:39:58 CST 2006
password: NOT SET
我们可以看到读进去的password为MECHANICS,但是读出来的却是NOT SET,因为在serialization时,没有存储到硬盘上,因为pwd被定义为transient类型的。
transient关键字也会产生副作用,见如下代码:
public class GuestLoggingInfo implements
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
GuestLoggingInfo()
{
uid = "guest";
pwd = "guest";
}
public String toString()
{
//same as above
}
}
读出来的pwd还是NOT SET,也就是默认的初始化是没有作用的。
另外记录一下java代码抛出异常的写法.
例如我想要抛出一个空指针异常:
if(compareBuffer == null) {
NullPointerException e = new NullPointerException("The compareBuffer is null!");
throw e;
}
实际上NullPointerException是继承自RuntimeException,而RuntimeException继承自Exception.
over!
相关文章
- 关于Comparable接口的使用
- 关于mybatis扫描所有namespace时报错,最终原因是resultMap不能使用(我的错误记录)
- qt中关于思源雅黑字体的使用
- 编一个函数求n的阶乘;使用for语句和while语句求n的阶乘;关于简单阶乘的求和(C)
- 使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除
- 关于vue使用打印会有一个空白页的问题
- 关于springboot security自定义拦截器 使用 permitAll 之后仍然会走过滤器的解决方法
- 关于 Spring Boot 后端项目使用 Maven 打包命令、JAR/WAR 对比、内嵌服务器与第三方服务器对比,以及热部署配置的详细说明
- 关于使用element-ui组件化el-cascader表单验证无法通过的解决
- 关于使用TreeMap按照value进行排序的解决方案