【问题标题】:Why use the `transient` keyword in java? [duplicate]为什么在java中使用`transient`关键字? [复制]
【发布时间】:2014-01-09 03:11:51
【问题描述】:

我有一个与 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.使用这个关键字的目的是什么?

【问题讨论】:

  • 您提供的链接回答了您的两个问题。你有什么疑问?哪些内容尚未涵盖?
  • @PeterLawrey 编辑我的问题,请查看我的课程,它没有实现序列化
  • 您的类可能会被您正在使用的库序列化,或者transient 可能会被您与模型一起使用的库用于其他目的。它可能会在视图中显示除transient 之外的所有字段。您必须阅读您正在使用的库的文档。
  • 有人能解释一下为什么我们要故意通过网络丢失对象吗?有什么例子吗?

标签: java serialization keyword transient modifier


【解决方案1】:

瞬态变量在 java 中从不序列化。

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

请看看serialization 是什么。?并参考this

例子

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

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

【讨论】:

  • “从不”太强了。 默认情况下它们不会序列化, 但如果您编写自己的 readObject()/writeObject() 方法,您可以自己序列化它们。
【解决方案2】:

还有一个简短的用例:
想象一下通过公共可用的网络服务公开一个用户对象。 您肯定想公开昵称、在线状态、电子邮件或位置等信息。 您绝对不想公开用户用于登录的密码。 虽然此密码可能是您的用户对象的属性, 它不应该被序列化,例如将对象序列化为 JSON 时 - 提到的 Web 服务的字符串。

【讨论】:

  • 非常好的用例。我只是来找那个的。
【解决方案3】:

transient 关键字表明对象不应该被序列化也不应该被持久化。如果不想序列化重物(比如Wrappers,可以包含很多业务逻辑),可以使用。

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

我已经包含了注释说明,因为我记得被这两者混淆了。 :-)

【讨论】:

  • transient 只是关于序列化,其含义由 JLS 精确指定。 @Transient 是第 3 方定义的注解,如果没有给出完全限定的类名,它是模棱两可的。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2010-12-28
    • 2011-03-30
    • 2014-12-05
    相关资源
    最近更新 更多