如果你的Serializable类包含了一个不可序列化的成员,会发生什么?你如何修复它?
2nbm6dog1#
类的一个字段是一个类的示例,该示例没有实现Serializable,它是一个标记接口(没有方法),告诉JVM它可以使用默认的序列化机制对其进行序列化。如果该类的所有字段本身都是Serializable,那么很简单--只需将implements Serializable添加到类声明中。如果没有,或者对该字段的类重复该过程,直到对象图。如果遇到一个不能或 * 不应该 * 成为Serializable的类,请在字段声明中添加transient关键字,这将告诉JVM在执行Serialization时忽略该字段。
Serializable
implements Serializable
transient
Serialization
rm5edbpk2#
当你试图Serialize它时,它会抛出一个NotSerializableException。为了避免这种情况,把那个字段设为transient字段。
Serialize
NotSerializableException
private transient YourNonSerializableObject doNotSerializeMe; // This field won't be serialized
jaxagkaj3#
除非字段声明为transient(这将阻止字段被序列化,即它不会被保存),否则类是不可序列化的。如果可以的话,我建议您将该成员设置为可序列化的,否则您必须使用writeObject和readObject手动写入和/或读取字段。http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
writeObject
readObject
h6my8fg24#
@哈希用户123:在不想序列化的字段前使用transient关键字。例如:
private transient int salary;
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; }
5条答案
按热度按时间2nbm6dog1#
类的一个字段是一个类的示例,该示例没有实现
Serializable
,它是一个标记接口(没有方法),告诉JVM它可以使用默认的序列化机制对其进行序列化。如果该类的所有字段本身都是
Serializable
,那么很简单--只需将implements Serializable
添加到类声明中。如果没有,或者对该字段的类重复该过程,直到对象图。
如果遇到一个不能或 * 不应该 * 成为
Serializable
的类,请在字段声明中添加transient
关键字,这将告诉JVM在执行Serialization
时忽略该字段。rm5edbpk2#
当你试图
Serialize
它时,它会抛出一个NotSerializableException
。为了避免这种情况,把那个字段设为transient
字段。jaxagkaj3#
除非字段声明为
transient
(这将阻止字段被序列化,即它不会被保存),否则类是不可序列化的。如果可以的话,我建议您将该成员设置为可序列化的,否则您必须使用
writeObject
和readObject
手动写入和/或读取字段。http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.htmlh6my8fg24#
@哈希用户123:在不想序列化的字段前使用transient关键字。例如:
cclgggtu5#
在序列化时,如果一些字段值,我们不想保存在文件中,我们在java中使用transient。类似地,类中的一些字段不能序列化,但类在我们使用Transient字段时扩展为可序列化
使用transient来排除一些不属于serializable的字段。