transient 关键字有什么用途
java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身。这可以极大地方便网络上的一些操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的东西都能存储(因为那样,别人可以通过序列化知道类里面的内容),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后,这个关键字定义的变量也就不再存在。
通常,我们写的程序都要求特定信息能持久存在或保存到磁盘上,以供一个程序使用或用在同一个程序的另一次运行上.这种持久性可以通过几种方式来实现,包括写到数据库中或是利用JAVA为对象序列化提供的支持.不管我们选用什么方法,类实例的持久性都是通过保存类的域的状态来完成的,保存这些状态,以便以后可以对它们进行访问或使用它们来创建相同的实例.然而,有可能并不是所有的域都需要被保存起来.当一个实例被持久化时,其内部的一些域却不需要持久化,则可以用trainsient修饰符告诉编译器指定的域不需要被持久保存.
首先,让我们看一些Java serialization的代码:
public class LoggingInfo implements java.io.Serializable
{
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 : " + loggingDate.toString() +
"\n password: " + password;
}
}
现在我们创建一个这个类的实例,并且串行化(serialize)它 ,然后将这个串行化对象写如磁盘。
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
System.out.println(logInfo.toString());
try
{
ObjectOutputStream o = new ObjectOutputStream(
new FileOutputStream("logInfo.out"));
o.writeObject(logInfo);
o.close();
}
catch(Exception e) {//deal with exception}
To read the object back, we can write
try
{
ObjectInputStream in =new ObjectInputStream(
new FileInputStream("logInfo.out"));
LoggingInfo logInfo = (LoggingInfo)in.readObject();
System.out.println(logInfo.toString());
}
catch(Exception e) {//deal with exception}
如果我们运行这段代码,我们会注意到从磁盘中读回(read——back (de-serializing))的对象打印password为"NOT SET"。这是当我们定义pwd域为transient时,所期望的正确结果。
现在,让我们来看一下粗心对待transient域可能引起的潜在问题。假设我们修改了类定义,提供给transient域一个默认值,
代码如下:
public class GuestLoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
GuestLoggingInfo()
{
uid = "guest";
pwd = "guest";
}
public String toString()
{
//same as above
}
}
现在,如果我们穿行化GuestLoggingInfo的一个实例,将它写入磁盘,并且再将它从磁盘中读出,我们仍然看到读回的对象打印password 为 "NOT SET"。
当从磁盘中读出某个类的实例时,实际上并不会执行这个类的构造函数,
而是载入了一个该类对象的持久化状态,并将这个状态赋值给该类的另一个对象。
分享到:
相关推荐
#### transient关键字的作用 `transient`关键字用于修饰那些不希望在序列化过程中保存的成员变量。当一个对象被序列化时,带有`transient`关键字的成员变量将不会被包含在序列化流中,这意味着当对象被反序列化时,...
transient 关键字的作用是告知 Java virtual machine(JVM)在序列化对象时,不要包括被标记为 transient 的属性。这意味着,当一个对象被序列化时,被标记为 transient 的属性不会被写入到输出流中,从而减少了序列...
**transient关键字的作用** `transient`关键字告诉Java编译器,该变量不应该作为持久状态的一部分进行序列化。当一个对象被序列化时,所有非`transient`和非`static`的字段都将被包含在序列化的表示中。然而,如果...
然而,并非所有的类属性都需要被序列化,这就是`transient`关键字发挥作用的地方。 1. `transient`关键字的作用 `transient`关键字用于标记类的成员变量,声明了`transient`的变量不会被包含在序列化过程中。这...
Java transient关键字原理解析 Java 中的 transient 关键字是一个重要的概念,它被用来表示变量将不被序列化处理。那么在理解 transient 关键字之前,我们先了解下什么是序列化。 序列化是对象进行持久化处理,也...
今天,我们将深入理解Java虚拟机-Java内存区域透彻分析,探讨序列化和反序列化的概念及其使用场景,实现序列化的方式,以及transient关键字的作用。 序列化和反序列化的概念 序列化是指将Java对象转换为二进制数据...
**transient关键字的作用** `transient`关键字用于标记一个实例变量,表示这个变量不应该作为对象状态的一部分进行序列化。当一个对象被序列化时,`transient`修饰的变量会被忽略,它们的值不会包含在序列化的表示中...
本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ### Java序列化简介 序列化是将对象的状态转换为可以存储或传输的格式的过程。在Java中,通过实现`java.io.Serializable`接口...
换句话说,当一个对象被序列化时,带有`transient`修饰的变量将不会被包含在序列化的表示中。 - 这通常用于处理那些敏感信息,比如密码、信用卡号等,这些信息在序列化时不应当被持久化,以避免潜在的安全风险。 -...
此外,`transient`关键字对Java的内存模型(JMM)没有影响,它只作用于序列化过程。在对象的生命周期中,`transient`变量的行为与其他非静态、非`final`字段相同,即在对象创建时初始化,可以通过 getter 和 setter ...
`transient`关键字的主要特点和用途如下: 1. **不参与序列化**:当一个类实现了`java.io.Serializable`接口,它的实例可以被序列化。但是,如果类中的某个字段被声明为`transient`,那么这个字段就不会被序列化器...
`transient`关键字的主要作用是在序列化过程中忽略特定的成员变量。序列化是将对象的状态转换为字节流的过程,便于存储或在网络中传输。反序列化则是将字节流恢复为原来的对象状态。当一个字段被声明为`transient`时...
Java编程语言的关键字是语言的核心组成部分,它们具有...`void`, `volatile`, `while` 等等,它们各自都有独特的功能和用途,在编写Java代码时扮演着不可或缺的角色。学习和理解这些关键字是掌握Java编程基础的关键。
这篇文档《Java关键字详细解》将深入探讨Java中的关键字及其用途。 首先,我们来看看Java中的主要关键字。`public`、`private`、`protected`是访问修饰符,用于控制类、方法和变量的访问权限。`public`可以被任何...
- **用途**:`abstract`关键字用于声明抽象类或抽象方法。抽象类不能被实例化,但可以被其他类继承;抽象方法没有具体实现,必须由子类提供实现。 - **示例**: ```java abstract class Animal { abstract void ...
### Java关键字详解 #### 概述 Java是一种广泛使用的面向对象编程语言,它拥有丰富的关键字集,用于控制程序的行为...每个关键字都有其特定的用途和语法规则,熟悉它们可以帮助开发者更好地控制程序的行为和逻辑结构。
### Java中的关键字大全 在Java编程语言中,关键字是一组预定义的词汇,它们具有特殊的含义和用途。理解和掌握这些关键字对于编写有效的Java程序至关重要。...了解并熟练掌握这些关键字有助于提高编程效率和代码质量。