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 序列化方法使用

  1. 继承Serializable接口
class SerializableDemo implements Serializable
  1. 创建可序列化对象
SerializableDemo demo = new SerializableDemo();
demo.value = 50;
  1. 创建ObjectOutputStream进行序列化
ObjectOutputStream stream =
        new ObjectOutputStream(new FileOutputStream("object.data"));
stream.writeObject(demo);
  1. 创建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小结

  1. 实现Serializable接口才可以序列化和反序列化。
  2. 使用ObjectInputStream和ObjectOuputStream进行反序列化和序列化。
  3. 通过writeObject和readObject方法重写完成序列化和反序列化方法重写。