当前位置: 首页 > 面试题库 >

最终瞬态字段和序列化

欧阳智志
2023-03-14
问题内容

final transient在Java中进行序列化后,是否可以将字段设置为任何非默认值?我的用例是一个缓存变量-
这就是为什么transient。我也有一个习惯,Map即不要更改字段(即,地图的内容已更改,但对象本身保持不变)final。但是,这些属性似乎是矛盾的-
尽管编译器允许这样的组合,但除反null序列化之后,我无法将字段设置为任何值。

我尝试了以下操作,但没有成功:

  • 简单的字段初始化(如示例所示):这是我通常所做的,但是在未序列化之后似乎没有发生初始化;
  • 构造函数中的初始化(我相信这在语义上与上面相同);
  • 由于字段为readObject(),因此无法在中分配字段final

在该示例cachepublic仅用于测试。

import java.io.*;
import java.util.*;

public class test
{
    public static void main (String[] args) throws Exception
    {
        X  x = new X ();
        System.out.println (x + " " + x.cache);

        ByteArrayOutputStream  buffer = new ByteArrayOutputStream ();
        new ObjectOutputStream (buffer).writeObject (x);
        x = (X) new ObjectInputStream (new ByteArrayInputStream (buffer.toByteArray ())).readObject ();
        System.out.println (x + " " + x.cache);
    }

    public static class X implements Serializable
    {
        public final transient Map <Object, Object>  cache = new HashMap <Object, Object> ();
    }
}

输出:

test$X@1a46e30 {}
test$X@190d11 null

问题答案:

不幸的是,简短的回答是“不”-我经常想要这个。但是瞬变不可能是最终的。

必须通过直接分配初始值或在构造函数中初始化final字段。在反序列化期间,这两个都不被调用,因此必须在反序列化期间调用的“
readObject()”私有方法中设置瞬态的初始值。为此,瞬变必须是非最终的。

(严格来说,决赛仅是在首次读取时才是决赛,因此可能会有黑客在读取值之前为其赋值,但是对我来说,这太过分了。)



 类似资料:
  • 是否有方法序列化类的瞬态字段?文档中提到默认情况下不支持它,但是否有办法打开它? 非常感谢

  • 我使用Redis作为Spring数据的数据库,没有自定义值或哈希值序列化器。我假设standrad JdkSerializationRedisSerializer应该用于对象序列化。看起来有些对象的临时字段被序列化到数据库中。 我如何克服这个问题?

  • 问题内容: 以下代码抛出。 这是输出: 怎么可能为空? 问题答案: 以下是有关瞬时变量的一些事实: - 当在实例变量上使用Transient关键字时,将 防止该实例变量被序列化。 - 在反序列化时,瞬态变量将恢复为其 默认值 ..... 例如: 对象引用变量 诠释为 boolean to etc ....... 所以这就是您反序列化时得到a的原因…

  • 我们正在开发基于spring boot 2.5.6的支付应用程序。该应用程序托管在docker上,并在Java14上启动。我们创建了一个名为的抽象类,它是,包含两个变量和。所有枚举类都扩展了这个基类,并在其中定义常量。 这个决定是为了定制整个应用程序层中使用的枚举。你可以在下面看到一个例子: 该类在实体层中用作嵌入变量,如下所示: 系统工作得很好,但是发生了一些错误,ShapeEnum的字段。RE

  • 问题内容: 我们将JSON序列化与Jackson结合使用,以公开系统的内部状态以调试属性。 默认情况下,杰克逊不会序列化瞬态字段-但我也希望对其进行序列化。如何序列化这些字段? 我知道的一种方法是为这些字段提供getter-但我不想这样做,因为我有一些我不想被调用的getX方法(例如,有些getter会更改对象状态)。 我知道我可以创建一个注释,但是我真的想避免使用它。 所以我的问题是:有没有一种

  • 问题内容: 我尝试了解通过引用同一封闭类对象初始化静态字段时初始化顺序的行为。 上面这段代码的输出是: 如果我将变量修改为除plain之外的其他任何内容: 输出为: 为什么会这样呢? 请注意,即使同时声明了两者,输出也是如此,在这种情况下,声明之前 问题答案: 静态最终成员先于其他静态成员初始化。 非最终静态成员按出现顺序初始化 因此,在您的第一种情况下: 构造函数在初始化之前首先被调用,因此被显