Java 哪些变量或对象应该与transient关键字关联?
我读过关于序列化理论的部分,它说当一个对象状态需要持久化时,它是必需的。 我已经编写了一个Web服务应用程序,它将在不同的JVM上运行 我正在改进Web服务的性能,因此我决定对Java 哪些变量或对象应该与transient关键字关联?,java,serialization,transient,Java,Serialization,Transient,我读过关于序列化理论的部分,它说当一个对象状态需要持久化时,它是必需的。 我已经编写了一个Web服务应用程序,它将在不同的JVM上运行 我正在改进Web服务的性能,因此我决定对Webservice类中的一些变量使用transient关键字 我有一些与之相关的问题,比如什么对象需要序列化,什么不应该序列化 1.首先,对于我的记录器,我将使用关键字transient 例如: private transient static final Logger logger = Logger.getLogger
Webservice
类中的一些变量使用transient
关键字
我有一些与之相关的问题,比如什么对象需要序列化,什么不应该序列化
1.首先,对于我的记录器,我将使用关键字transient
例如:
private transient static final Logger logger = Logger.getLogger(Tata.class);
String strategyData = null;
String errorText = null;
Properties prop = null;
2.但是类中的实例变量呢??我们是否需要为他们使用瞬态??
例如:
private transient static final Logger logger = Logger.getLogger(Tata.class);
String strategyData = null;
String errorText = null;
Properties prop = null;
请共享您的输入。序列化用于需要保持对象状态的情况。或者需要在不同的机器(或者虚拟机,如果您在一台机器上使用多个vm)之间传输对象状态,等等 例如,如果在重新启动系统后仍要更改对象的状态,则可以使用序列化 此外,可能不需要保存对象中的所有状态。为此,您可以将该变量声明为瞬态变量 如果只需要保存
strategyData
,则可以将其他两个变量声明为瞬态变量
注意。如果需要序列化对象。内部引用的所有对象也必须是可序列化的,或者您需要将它们声明为瞬态。您应该将所有不能或不应该与其他对象字段一起序列化的字段标记为瞬态 无法序列化本身不可序列化的字段,因此如果它属于可序列化类,则必须将其标记为瞬态。示例是包含多个字段的类,其中一个字段是Thread。显然,线程无法序列化。所以,将其标记为瞬态,并实现在序列化后恢复对象时创建新线程的机制
另一个例子是字段可以序列化,但不应该序列化。例如进程ID。假设您的程序持有其他进程的进程ID。进程ID本身是
int
,因此序列化它没有问题。但它在其他环境或几分钟内在同一环境中没有任何意义(因为该过程可能已经不存在) 如果变量被声明为瞬态变量,那么它将不会被持久化。这是transient关键字的主要用途
因此,不需要存储在对象持久化状态中的所有变量都可以声明为瞬态变量
有关更多详细信息,请参阅web服务类本身从未序列化。web服务方法返回的数据对象及其参数将被序列化。它们应该包含对象接收者所需的信息 如果收件人不需要某些信息,并且如果对象不会导致异常,并且该信息设置为null,则可以将其标记为瞬态。但是如果接收者不需要它,那么它首先可能不应该是对象的一部分
如果您在DTO内部使用记录器,那么此记录器绝对不应序列化。但是,请确保每次使用记录器时都检查它是否不为空。您所说的“在不同的JVM上运行”是什么意思 如果它将在多个JVM(例如分布式服务器)上同时运行,则表示对象状态的变量不能是瞬态的
否则,其他服务器实例将使您的服务处于不一致的状态。请访问可能对您有用的链接
没有意义。谢谢,如果实例变量是序列化对象的一部分,我们可以将这些实例变量声明为瞬态吗???@yyy当然可以。你可以将它们声明为瞬态。我很困惑,请参考Hemant Metalia的回答,他说“所有不需要存储在对象持久状态中的变量都可以声明为瞬态。”你说的正好相反,什么是正确的?如果我告诉你,我很抱歉。我也这么说。我说的是,如果在你的对象中有一个可序列化的对象(B)。如果你不想序列化(B)。您可以将其标记为瞬态。但是如果对象中有对象(C)。如果需要序列化C,则C必须是
实现
可序列化的类中的对象。