【问题标题】:Which variables or Objects should be associated with transient keyword?哪些变量或对象应该与瞬态关键字相关联?
【发布时间】:2012-01-21 02:37:50
【问题描述】:

我已经阅读了序列化理论部分,它说当需要持久化对象状态时需要它。 我编写了一个 Web 服务应用程序,它将在不同的 JVM 上运行

我正在改进我的 Web 服务的性能,所以我决定在 Webservice 类中的一些变量中使用 transient 关键字

我有一些与此相关的问题,比如哪些对象需要序列化,哪些不应该被序列化

1.首先从我的 Logger 开始,我将使用关键字transient 例如:

private transient static final Logger logger = Logger.getLogger(Tata.class);

2.但是类中的实例变量呢?我们是否需要为他们使用瞬态? 例如:

String strategyData = null;
String errorText = null;
Properties prop = null;

请分享您的意见。

【问题讨论】:

标签: java serialization transient


【解决方案1】:

序列化用于需要保持对象状态的情况。或者需要在不同机器(或虚拟机,如果您在一台机器上使用多个虚拟机)之间传输对象状态等。

例如。如果您在重新启动系统后对象的状态是什么,您可以使用序列化。

另外,您可能不需要保存对象中的所有状态。为此,您可以将该变量声明为瞬态。

如果您只需要持久化strategyData,您可以将其他两个变量声明为瞬态。

注意。如果你需要序列化一个对象。内部引用的所有对象也必须是可序列化的,否则您需要将它们声明为瞬态。

【讨论】:

  • 谢谢,如果实例变量是序列化对象的一部分,我们可以将这些实例变量声明为瞬态吗??
  • @yyy 当然。您可以将它们声明为瞬态。
  • 我很困惑,请参考 Hemant Metalia 的回答,他说“所有那些你不需要存储在对象的持久状态中的变量都可以声明为瞬态。”你说反了,什么是正确的??
  • 如果我让你感到困惑,我很抱歉。我也这么说。我说的是,如果在你的对象中有另一个可序列化的对象(B)。如果你不想序列化(B)。您可以将其标记为瞬态。但。如果您的对象中有一个对象(C)。如果需要序列化 ​​C。C 必须是来自 implementsSerializable 的类中的对象。
【解决方案2】:

您应该将所有不能或不应与其他对象字段一起序列化的字段标记为瞬态。

本身不可序列化的字段不能被序列化,因此如果它属于可序列化类,则必须将其标记为瞬态。该示例是包含多个字段的类,其中之一是 Thread。显然线程不能被序列化。因此将其标记为瞬态并实现在序列化后恢复对象时创建新线程的机制。

其他例子是字段可以但不应该被序列化。例如进程 ID。假设您的程序拥有其他进程的进程 ID。进程ID本身是int,所以序列化没有问题。但它在其他环境或同一环境中几分钟内没有任何意义(因为该进程可能已经不存在)。

【讨论】:

    【解决方案3】:

    如果变量被声明为瞬态,那么它将不会被持久化。这是transient关键字的主要用途。

    因此,您不需要在对象的持久状态中存储的所有变量都可以声明为瞬态。

    更多详情请参考http://www.javabeat.net/tips/168-what-is-transient-keyword-in-java.html

    【讨论】:

      【解决方案4】:

      Web 服务类本身永远不会被序列化。 Web 服务方法返回的数据对象及其参数是序列化的。它们应该包含对象接收者所需的信息。

      如果接收者不需要某些信息,并且如果对象不会在此信息设置为 null 时导致异常,则可以将其标记为瞬态。但如果接收者不需要它,它可能一开始就不应该是对象的一部分。

      如果您在 DTO 中使用记录器,则绝对不应序列化此记录器。但请确保每次使用记录器时都检查记录器不为空。

      【讨论】:

        【解决方案5】:

        “在不同的 JVM 上运行”是什么意思?

        如果它会在多个 JVM(例如分布式服务器)上同时运行而不是,则表示对象状态的变量不能是瞬态的。

        否则其他服务器实例会使您的服务处于不一致状态。

        【讨论】:

          【解决方案6】:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-04-07
            • 1970-01-01
            • 2021-05-21
            • 1970-01-01
            • 2012-09-23
            • 2021-11-03
            • 2015-04-12
            • 1970-01-01
            相关资源
            最近更新 更多