java.io.Serializable
Serializable接口是java中一个标记接口(没有任何方法)
public class SerializableDemo0 {
public static void main(String[] args) throws Exception{
ObjectOutputStream outputStream=new ObjectOutputStream(new FileOutputStream("E:/out.txt"));
outputStream.writeObject(new SerializableDemo0());
}
}
没有实现Serializable接口的类序列化时会报错。
public class SerializableDemo1 implements Serializable {
private static int count = 100;
private String name;
private transient int age;
public static void main(String[] args) throws IOException, ClassNotFoundException {
SerializableDemo1 demo = new SerializableDemo1();
demo.name = "serializable";
demo.age = 18;
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("E:/out.txt"));
outputStream.writeObject(demo);
SerializableDemo1.count = 99;
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("E:/out.txt"));
demo = (SerializableDemo1) inputStream.readObject();
System.out.println("count=" + count);
System.out.println("name=" + demo.name);
System.out.println("age=" + demo.age);
}
}
静态变量和transient变量不会被序列化。
public class SerializableDemo2 implements Serializable {
private static final long serialVersionUID = 7371040714373951874L;
private static int count = 100;
private String name;
private transient int age;
public static void main(String[] args) throws Exception{
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("E:/out.txt"));
SerializableDemo2 demo = (SerializableDemo2) inputStream.readObject();
}
}
序列化的serialVersionUID与返序列化不一致时会报错
public class SerializableDemo3 extends SerializableDemo2 {
private String score;
public static void main(String[] args) throws Exception{
SerializableDemo3 demo3=new SerializableDemo3();
demo3.score="abc";
ObjectOutputStream outputStream=new ObjectOutputStream(new FileOutputStream("E:/out2.txt"));
outputStream.writeObject(demo3);
ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream("E:/out2.txt"));
demo3= (SerializableDemo3) inputStream.readObject();
System.out.println(demo3.score);
}
}
父类实现了Serializable接口后子类不用实现Serializable也可以进行序列化操作。
总结:
1、要进行序列化的对象类必需直接或间接实现Serializable接口(父类实现了Serializable接口也可以)
2、静态字段,transient修饰的字段不会被序列化
3、若手动添加了serialVersionUID字段,则反序列化时要求serialVersionUID值相同