java 如果你的Serializable类包含了一个不可序列化的成员,会发生什么?你如何修复它?

6za6bjd0  于 2023-03-06  发布在  Java
关注(0)|答案(5)|浏览(227)

如果你的Serializable类包含了一个不可序列化的成员,会发生什么?你如何修复它?

2nbm6dog

2nbm6dog1#

类的一个字段是一个类的示例,该示例没有实现Serializable,它是一个标记接口(没有方法),告诉JVM它可以使用默认的序列化机制对其进行序列化。
如果该类的所有字段本身都是Serializable,那么很简单--只需将implements Serializable添加到类声明中。
如果没有,或者对该字段的类重复该过程,直到对象图。
如果遇到一个不能或 * 不应该 * 成为Serializable的类,请在字段声明中添加transient关键字,这将告诉JVM在执行Serialization时忽略该字段。

rm5edbpk

rm5edbpk2#

当你试图Serialize它时,它会抛出一个NotSerializableException。为了避免这种情况,把那个字段设为transient字段。

private transient YourNonSerializableObject doNotSerializeMe; // This field won't be serialized
jaxagkaj

jaxagkaj3#

除非字段声明为transient(这将阻止字段被序列化,即它不会被保存),否则类是不可序列化的。
如果可以的话,我建议您将该成员设置为可序列化的,否则您必须使用writeObjectreadObject手动写入和/或读取字段。http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

h6my8fg2

h6my8fg24#

@哈希用户123:在不想序列化的字段前使用transient关键字。例如:

private transient int salary;
cclgggtu

cclgggtu5#

在序列化时,如果一些字段值,我们不想保存在文件中,我们在java中使用transient。类似地,类中的一些字段不能序列化,但类在我们使用Transient字段时扩展为可序列化

class Cat implements serializable {
 private int eyes;
 private String voice;
}

使用transient来排除一些不属于serializable的字段。

class Cat implements serializable {
 private int eyes;
 private transient String voice;
}

相关问题