java序列化的应用场景:
1、当对象需要被网络传输时
2、当对象需要持久化时
一段序列化的工具类SerializeTool
public class SerializeTool {
public static void serialize(Object obj, String fileName) throws Exception{
File file = new File(fileName);
FileOutputStream output = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(output);
oos.writeObject(obj);
oos.flush();
oos.close();
output.close();
}
//反序列化
public static Object deSerialize(String fileName) throws Exception{
File file = new File(fileName);
FileInputStream input = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(input);
Object object = ois.readObject();
ois.close();
input.close();
return object;
}
//显示文件信息,包括文件名,文件大小等,注意,这段代码可能有问题,但可以
//找到那份文件,右击选择属性查看文件大小
public static void printFileInfo(String fileName){
File file = new File(fileName);
System.out.println("---------------");
System.out.println("<FileName>:"+fileName);
System.out.println("<FileSize>:"+fileName.length()+"bytes");
System.out.println("---------------");
}
}
对象序列化,序列化的是什么东西
1、对象序列化,只对类的普通成员序列化
2、对象序列化,不序列化静态成员、瞬态成员和方法(为了保护敏感数据,即遇到不对对象的某些字段序列化,可以使用transient关键字)
比如:transient private String password;
继承关系的序列化
子类继承父类,父类实现Serializable接口,当子类也实现Serializable,进行对象序列化,继承父类的属性也会被序列化到文件中
子类继承父类,父类不实现Serializable接口,当子类也实现Serializable,进行对象序列化,继承父类的属性不会被序列化到文件中
可以查看文件大小去证明,也可以显示某个继承的字段的值去证明
引用关系的序列化
同理,被引用的关系,也同样需要实现Serializable接口。如果类的一个参数类型是引用类型,那么这个引用类型的类必须是可序列化的,否则,该类将不可序列化。
在序列化类中,一般会有一个属性叫serialVersionUID(如:private static final long serialVersionUID = 1L;
),在序列化与发序列化的过程中,serialVersionUID起着非常重要的作用,每个类都有一个特定的serialVersonUID,在反序列化的过程中,通过serialVersionUID来判定类的兼容性。如果待序列化的对象与目标对象的serialVersionUID不同,那么在反序列化时就会抛出InvailidClassException异常。
自定义serialVersionUID的3个优点:
(1)提高程序的运行效率。如果未自定义,那么在序列化时会通过计算得到一个serialVersionUID值。通过显示声明的方式省去了计算能的过程。
(2)提高程序不同平台上的兼容性。若没有显示声明serialVersionUID,不同的平台可能在计算serialVersionUID时得到的结果不同,这样的话就会出现在A平台序列化,在B平台反序列化时出现不兼容的情况
(3)增强程序各个版本的可兼容性。每个类都自定义一个UID,那么如果对这个类进行修改时,自定义的UID也要跟着修改,那么就会防止旧版本的类对象反序列化到新版本的类对象
注意:反序列化机制在恢复java对象的时候无需调用构造器来初始化java对象
下一篇,继续序列化