最终瞬态字段和序列化
2022-08-31 14:49:17
在 Java 中序列化后,是否可以将字段设置为任何非默认值?我的用例是一个缓存变量 - 这就是为什么它是.我也有一个习惯,即制作不会更改的字段(即地图的内容已更改,但对象本身保持不变)。但是,这些属性似乎是矛盾的 - 虽然编译器允许这样的组合,但除了取消序列化之后,我无法将字段设置为任何内容。final transient
transient
Map
final
null
我尝试了以下方法,但没有成功:
- 简单的字段初始化(如示例所示):这是我通常执行的操作,但在取消序列化后初始化似乎没有发生;
- 构造函数中的初始化(我相信这在语义上与上述相同);
- 无法将字段分配到 — 中,因为该字段为 。
readObject()
final
在示例中仅用于测试。cache
public
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