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

Sit*_*nsu 11 java serialization modifier keyword transient

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

变量声明:

transient private ResourceBundle pageResourceBundle; 
Run Code Online (Sandbox Code Playgroud)

我的班级看起来像这样:

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());
    }
Run Code Online (Sandbox Code Playgroud)

我有一些问题.

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

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

rac*_*ana 29

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

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

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

public class Foo implements Serializable
{
  private String saveMe;
  private transient String dontSaveMe;
  private transient String password;
  //...
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中dontSaveMe,password它们永远不会被序列化,因为它们被声明为a transient variables.

  • "永远"太强大了.默认情况下,它们不是序列化的*,但是如果您编写自己的`readObject()/ writeObject()`方法,您可以自己序列化它们. (4认同)

Pet*_*ter 17

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


GGr*_*rec 7

transient关键字表示该对象不应序列化,也不应保留.如果您不想序列化重型对象(Wrapper例如,可以包含许多业务逻辑的s),则可以使用它.

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

我已经包含了注释解释,因为我记得被两者搞糊涂了.:-)