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

时间:2013-12-20 09:40:25

标签: java serialization keyword transient modifier

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

变量声明:

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.使用此关键字的目的是什么?

4 个答案:

答案 0 :(得分:29)

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

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

请看看serialization是什么。并且还可以参考this

实施例

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

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

答案 1 :(得分:16)

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

答案 2 :(得分:7)

transient关键字表示对象不应序列化也不能保留。如果您不想序列化重型对象(例如Wrapper,可能包含大量业务逻辑),则可以使用它。

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

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

答案 3 :(得分:3)

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

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