我想在我的java程序中序列化一个非静态内部类。虽然这是不允许的,因为我的内部类(默认情况下)有一个对它的外部类的引用(在这种情况下是不可序列化的)所以如果我尝试序列化它,我会得到外部类的NullPointerException。
那么是否有一种方法可以覆盖对外部类的引用并将其设置为瞬态,以便每次初始化时都不会对其进行序列化并创建内部类的对象?
答案 0 :(得分:3)
您不能:如果您的内部类不是static
,则根据定义,其初始化状态依赖于在外部类的实例上。这是因为如果没有外部类的实例,你就无法获得内部类的实例。
由于外部类不是Serializable
,因此无法序列化外部类的实例,因此无法序列化内部类的实例。
或者只是让内部类静态并完成它......
答案 1 :(得分:2)
您无法对封闭实例transient
进行隐式引用,但可以做的是重新设计以使其成为嵌套(静态)类并明确传递封闭实例在构造函数参数中。然后,您需要在嵌套类中使用显式变量,您可以将其标记为transient
。
答案 2 :(得分:0)
自动序列化有一些负面部分:如果更改字段名称或更改字段的可见性,则反序列化将不起作用,更多结果:它将需要“自动”保存更多空间对象。出于这个原因,我几乎总是手动序列化/反序列化类:写一个int,写一个字符串而不是读回来。 使用此方法,您可以根据需要编写无静态内部类反序列化