当在 Java 中对一个对象进行序列化时,如果该对象的类没有实现 Serializable
接口,就会抛出 NotSerializableException
异常。解决这个问题的方法有两种:
方法一:实现 Serializable 接口
最直接的解决办法就是让该对象所属的类实现 Serializable
接口。Serializable
接口是一个标记接口,仅有一个方法也没有具体的实现,它的作用就是标记该类可以被序列化。示例如下:
public class Person implements Serializable {
private String name;
private int age;
// 构造方法、getter、setter 省略
}
对于 Person
类,它的对象就可以被序列化了。
方法二:自定义序列化
有时候,我们不能修改类的源代码,此时就可以通过自定义序列化来解决问题。自定义序列化就是在自定义一个 writeObject 方法和一个 readObject 方法,在这两个方法中手动序列化和反序列化对象。示例代码如下:
public class Person implements Serializable {
private String name;
private int age;
// 构造方法、getter、setter 省略
private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(name);
out.writeInt(age);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
name = (String) in.readObject();
age = in.readInt();
}
}
注意:要在自定义的序列化方法中,按照序列化的顺序逐个写入或读取数据。
另外,如果我们需要序列化的对象包含了一个不实现 Serializable
接口的属性,可以采用以下方式处理。假设 Person
类中还包含了一个 Address
对象属性,而 Address
类没有实现 Serializable
接口,那么可以在 Person
类中添加如下两个方法:
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(address.getCity());
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
address = new Address(in.readObject());
}
第一个方法中,我们先调用默认的序列化方法 defaultWriteObject,接着手动将属性 address 中需要序列化的字段写入到输出流中。第二个方法中,首先调用默认的反序列化方法 defaultReadObject,接着手动将属性 address 中反序列化的字段读取出来,并根据这些字段构建出一个 Address 对象。
以上就是 Java 中序列化 NotSerializableException 问题的两种解决方式。通过实现 Serializable 接口或者自定义序列化,完美解决这个问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 中序列化NotSerializableException问题解决办法 - Python技术站