java transient作用_为什么 Java 有 transient 关键字?它的作用是什么?

问题

为什么 Java 有 transient 关键字?

#1 热门回答(1387 赞)

Java中的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被序列化,而 thumbnailImage 没有被序列化。这意味着只需要更少的存储空间来保存序列化对象。 (当然,根据系统的要求,这可能是也可能不是理想的 - 这仅仅是一个例子。)

在反序列化时,调用readObject方法来执行必要的操作,以将对象的状态恢复到发生序列化的状态。在这里,需要生成缩略图,所以readObject方法被覆盖,以便通过调用generateThumbnail方法来生成缩略图。

有关其他信息,Discover the secrets of the Java Serialization APIarticle(最初在Sun开发者网络上提供)有一节讨论了使用并提供了一个场景,其中使用transient关键字来防止某些字段的序列化。

#2 热门回答(343 赞)

在理解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

Middle Nameis被声明为transient,所以它不会被存储在永久存储器中。

Source

#3 热门回答(78 赞)

允许你定义你不想序列化的变量。

在一个对象中,你可能有一些你不想序列化/持久化的信息(可能是对一个父工厂对象的引用),或者序列化没有意义。将这些标记为transient 意味着序列化机制将忽略这些字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值