public static void readObj() throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
//创建一个序列化对象的读取流
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("f:\\obj.object"));
//readObject读取到的为一个对象,将其强转为Person对象
Person p=(Person)ois.readObject();
System.out.println(p.getName()+"->"+p.getAge());
ois.close();
}
运行结果:
Serializable接口:
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致InvalidClassException
。可序列化类可以通过声明名为 "serialVersionUID"
的字段(该字段必须是静态 (static)、最终 (final) 的long
型字段)显式声明其自己的 serialVersionUID:
可以使用此种方法在对象中创建ID号: public|private|protected static final long serialVersionUID = 42L;
个人理解:每一个可序列化的类都有一个固定的对应的ID号,在反序列化中用于验证发送者与接受者时候对应你一致的对象
public class Person implements Serializable {
/**
*
*/
private static final long serialVersionUID = 9527l;
private String name;
private int age;
}
public transient String name;
transient:当对象存储时,不想存入到序列化中,但又不想被静态
当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。