为什么在java中使用`transient`关键字?

我在java中的private修饰符之前有一个与transient关键字的使用相关的问题。

变量声明:

 transient private ResourceBundle pageResourceBundle; 

当我用谷歌搜索它时,我在下面找到了这些文档,但它们正在谈论序列化。 实际上我的class级没有实现任何序列化。

欲了解更多信息:

http://java91.blogspot.in/2017/01/why-does-java-have-transient-fields.html

我的class级看起来像这样:

 public class LoginViewModel extends AbstractViewModel { transient private ResourceBundle pageResourceBundle; @AfterCompose public void afterCompose(@ContextParam(ContextType.VIEW) Component view) { initializeLoginValues(); boolean timeout = BooleanUtils.toBoolean(getHttpServletRequest().getParameter("timeout")); if (timeout) { Messagebox.show(pageResourceBundle.getText("MSG_SESSION_HAS_EXPIRED_PLEASE_LOGIN"), pageResourceBundle.getText("LABEL_ALERT"), Messagebox.OK, Messagebox.ERROR); } view.getPage().setTitle(CsdcLicence.get().getApplicationName()); } 

我有一些疑问。

1.为什么在私有变量之前使用transient关键字?

2.使用此关键字的目的是什么?

瞬态变量永远不会在java中序列化。

它标记了一个成员变量,当它被持久化为字节流时不被序列化。 当通过网络传输对象时,该对象需要“序列化”。 序列化将对象状态转换为串行字节。 这些字节通过网络发送,并从这些字节重新创建对象。 由java transient关键字标记的成员变量不会被转移,它们会被故意丢失。

请看一下序列化是什么。 并且也参考这个

 public class Foo implements Serializable { private String saveMe; private transient String dontSaveMe; private transient String password; //... } 

在上面的示例中, dontSaveMepassword永远不会被序列化,因为它们被声明为transient variables

一个简短的用例:
想象一下,通过公共可用的Web服务公开用户对象。 您肯定希望将内容公开为昵称,在线状态,可能是电子邮件或位置。 您绝对不希望公开用户登录时使用的密码。 虽然此密码可能是User-对象的属性,但不应序列化,例如将对象序列化为JSON时 – 提到的Web服务的字符串。

transient关键字表明该对象不应该被序列化也不 应该被 持久化 。 如果您不想序列化重型对象(例如,包含大量业务逻辑的Wrapper ,则可以使用它。

@Transient注释表明该对象不应该被持久化 (例如,如果您一直在使用Hibernate),但它可以被序列化

我已经包含了注释解释,因为我记得被两者搞糊涂了。 🙂

  • 瞬态关键字只能应用于成员变量。
    将它应用于方法或局部变量是编译错误。

  • Java中的关键字transient用于表示变量
    不应序列化。 默认情况下,对象中的所有变量都将转换为持久状态。 在某些情况下,您可能想要
    避免持久化某些变量,因为您没有必要通过网络进行传输。 所以,你可以声明那些变量
    transient

transient用于指定不保存或序列化对象的哪些属性。 例如,将对象保存到文件时, transient指定将该对象保存到文件时不会将哪些属性或属性保存到该文件。

从文件重新创建对象时,不会重新创建该transient属性(或私有属性)的值,因为它从未保存或序列化到该文件。 在某些情况下,您可能希望避免持久化某些私有实例变量或对象的属性, transient允许您这样做。