2

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

请分享您的意见。

4

6 回答 6

1

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

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

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

于 2011-12-15T11:41:23.080 回答
0

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

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

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

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

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

于 2011-12-15T11:40:43.893 回答
0

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

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

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

于 2011-12-15T11:41:12.390 回答
0

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

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

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

于 2011-12-15T11:42:14.423 回答
0

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

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

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

于 2011-12-15T11:42:44.037 回答
0

访问可能对您有用的链接..

http://javarevisited.blogspot.com/2011/09/transient-keyword-variable-in-java.html

于 2011-12-15T11:44:20.283 回答