为什么在java中使用“瞬态”关键字?

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

变量声明:

transient private ResourceBundle pageResourceBundle; 

我的类看起来像这样:

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.使用这个关键词的目的是什么?


答案 1

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

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

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

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

在上面的示例中,并且永远不会被序列化,因为它们被声明为 .dontSaveMepasswordtransient variables


答案 2

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