4.5 Serializable
Java中Serializable是标识类可序列化和反序列化的接口。如果不继承Serializable接口,直接使用序列化方法就会抛出如下异常,解决办法继承Serializable接口。
com.lbh.xxmanager.basic.io.SerializableDemo
Exception in thread "main" java.io.NotSerializableException: com.lbh.xxmanager.basic.io.SerializableDemo
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at com.lbh.xxmanager.basic.io.SerializableDemo.main(FileDemo.java:213)
4.5.1 Serializable使用
继承Serializable接口。
class SerializableDemo implements Serializable
4.5.2 序列化方法使用
- 继承Serializable接口
class SerializableDemo implements Serializable
- 创建可序列化对象
SerializableDemo demo = new SerializableDemo();
demo.value = 50;
- 创建ObjectOutputStream进行序列化
ObjectOutputStream stream =
new ObjectOutputStream(new FileOutputStream("object.data"));
stream.writeObject(demo);
- 创建ObjectInputStream进行反序列化
ObjectInputStream objectInputStream =
new ObjectInputStream(new FileInputStream("object.data"));
SerializableDemo readObject = (SerializableDemo) objectInputStream.readObject();
System.err.println(readObject.value);
4.5.3 序列化方法重写
官方注释:
* <PRE>
* private void writeObject(java.io.ObjectOutputStream out)
* throws IOException
* private void readObject(java.io.ObjectInputStream in)
* throws IOException, ClassNotFoundException;
* private void readObjectNoData()
* throws ObjectStreamException;
* </PRE>
重写方法writeObject,readObject。
private void writeObject(java.io.ObjectOutputStream out)
throws IOException{
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException{
}
private void readObjectNoData()
throws ObjectStreamException{
}
上述代码完整示例。
class SerializableDemo implements Serializable{
public int value;
private void writeObject(java.io.ObjectOutputStream out)
throws IOException{
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException{
}
private void readObjectNoData()
throws ObjectStreamException{
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
SerializableDemo demo = new SerializableDemo();
demo.value = 50;
ObjectOutputStream stream =
new ObjectOutputStream(new FileOutputStream("object.data"));
stream.writeObject(demo);
ObjectInputStream objectInputStream =
new ObjectInputStream(new FileInputStream("object.data"));
SerializableDemo readObject = (SerializableDemo) objectInputStream.readObject();
System.err.println(readObject.value);
}
}
4.5.4 Serializable小结
- 实现Serializable接口才可以序列化和反序列化。
- 使用ObjectInputStream和ObjectOuputStream进行反序列化和序列化。
- 通过writeObject和readObject方法重写完成序列化和反序列化方法重写。