为什么Java有瞬态字段?
网友回答:
在理解关键字之前,必须了解序列化的概念。如果读者知道序列化,请跳过第一点。transient
序列化是使对象的状态持久化的过程。这意味着对象的状态被转换为字节流,用于持久化(例如,将字节存储在文件中)或传输(例如,通过网络发送字节)。同样,我们可以使用反序列化从字节中恢复对象的状态。这是 Java 编程中的重要概念之一,因为序列化主要用于网络编程。需要通过网络传输的对象必须转换为字节。为此,每个类或接口都必须实现该接口。它是一个没有任何方法的标记接口。Serializable
transient
默认情况下,对象的所有变量都转换为持久状态。在某些情况下,您可能希望避免保留某些变量,因为您不需要保留这些变量。因此,您可以将这些变量声明为 .如果变量声明为 ,则不会持久保存该变量。这是关键字的主要目的。transient
transient
transient
我想用下面的例子来解释以上两点(借用了这篇文章):
package javabeat.samples; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class NameStore implements Serializable{ private String firstName; private transient String middleName; private String lastName; public NameStore (String fName, String mName, String lName){ this.firstName = fName; this.middleName = mName; this.lastName = lName; } public String toString(){ StringBuffer sb = new StringBuffer(40); sb.append("First Name : "); sb.append(this.firstName); sb.append("Middle Name : "); sb.append(this.middleName); sb.append("Last Name : "); sb.append(this.lastName); return sb.toString(); } } public class TransientExample{ public static void main(String args[]) throws Exception { NameStore nameStore = new NameStore("Steve", "Middle","Jobs"); ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("nameStore")); // writing to object o.writeObject(nameStore); o.close(); // reading from object ObjectInputStream in = new ObjectInputStream(new FileInputStream("nameStore")); NameStore nameStore1 = (NameStore)in.readObject(); System.out.println(nameStore1); } }
输出将如下所示:
First Name : Steve Middle Name : null Last Name : Jobs
中间名声明为 ,因此不会存储在持久存储中。transient
网友回答:
Java 中的关键字用于指示字段不应是序列化过程的一部分(这意味着保存,如文件)过程。transient
摘自 Java 语言规范,Java SE 7 版,第 8.3.1.3 节。 领域:transient
可以标记变量以
指示它们不是对象持久状态的一部分
。transient
例如,您可能具有派生自其他字段的字段,并且应仅以编程方式执行此操作,而不是通过序列化来保留状态。
下面是一个类,其中包含一个图像和一个从图像派生的缩略图:GalleryImage
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
private void generateThumbnail()
{
// Generate thumbnail.
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
generateThumbnail();
}
}
在此示例中,是通过调用该方法生成的缩略图。thumbnailImage
generateThumbnail
该字段标记为 ,因此仅序列化原始图像,而不是同时保留原始图像和缩略图图像。这意味着保存序列化对象所需的存储更少。(当然,根据系统的要求,这可能是可取的,也可能不是可取的——这只是一个例子。thumbnailImage
transient
image
在反序列化时,调用该方法以执行将对象的状态还原回序列化发生的状态所需的任何操作。这里需要生成缩略图,因此重写了该方法,以便通过调用该方法生成缩略图。readObject
readObject
generateThumbnail
有关其他信息,文章发现 Java 序列化 API 的秘密(最初在 Sun 开发人员网络上提供)中有一节讨论了关键字用于防止某些字段序列化的用法,并介绍了使用关键字防止序列化某些字段的场景。transient
网友回答:
允许您定义不想序列化的变量。
在对象中,您可能具有不想序列化/保留的信息(可能是对父工厂对象的引用),或者序列化可能没有意义。将这些字段标记为“暂时性”意味着序列化机制将忽略这些字段。
模板简介:该模板名称为【为什么Java有瞬态字段?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。