哪些变量或对象应与transient关键字相关联?

时间:2011-12-15 11:33:48

标签: java serialization transient

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

我正在改进我的Web服务的性能,所以我决定在我的transient

中使用Webservice关键字作为我的一些变量

我有一些与之相关的问题,因为需要序列化的对象和不应该是什么

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

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

2.但是类里面的实例变量怎么样?我们是否需要为他们使用瞬态? 例如:

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

请分享您的意见。

6 个答案:

答案 0 :(得分:1)

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

所以那些你不需要存储在对象持久化状态中的变量都可以声明为瞬态。

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

答案 1 :(得分:0)

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

对于前。如果您在重新启动系统后仍然处于对象的状态,则可以使用序列化。

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

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

请注意。如果需要序列化对象。内部引用的所有对象也必须是Serializable,或者您需要将它们声明为瞬态。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)