关于序列化:为什么使用Java中的`transient` 关键字?

Why use the `transient` keyword in java?

本问题已经有最佳答案,请猛点这里访问。

在Java中,在EDCOX1×1的修改器之前,我有一个与EDCOX1 0关键字相关的问题。

变量声明:

1
transient private ResourceBundle pageResourceBundle;

我的班级如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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临时关键字标记的成员变量没有被转移,它们是故意丢失的。

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

例子

1
2
3
4
5
6
7
public class Foo implements Serializable
{
  private String saveMe;
  private transient String dontSaveMe;
  private transient String password;
  //...
}

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


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


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

@Transient注释建议不应持久化对象(例如,如果您正在玩Hibernate),但可以序列化它。

我已经包括了注释解释,因为我记得被这两个混淆了。-)


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

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