繁体   English   中英

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

[英]Which variables or Objects should be associated with transient keyword?

我已经阅读了有关序列化理论的部分,其中说当需要保持对象状态时,它是必需的。 我已经编写了一个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;

请分享您的意见。

如果将变量声明为瞬态,则将不会持久化该变量。 它是瞬时关键字的主要目的。

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

有关更多详细信息,请参见http://www.javabeat.net/tips/168-what-is-transient-keyword-in-java.html

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

对于前。 如果即使重新启动系统后对象的状态是什么,也可以使用序列化。

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

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

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

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

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

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

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

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

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

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

如果将几个的JVM(例如分布式服务器)比表示你的对象的状态不能是短暂的变量同时运行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM