Java序列化的实现一共有两种方式,实现于接口 Serializable 和Externalizable
Serializable实现序列化细节
序列化类及其对象必须实现Serializable 接口
transient修饰为临时属性,不参与序列化
读取到文件尾部的标记:java.io.EOFException
使用serialVersionUID 属性保证序列化类和反序列化类是一致的
Externalizable实现序列化细节
序列化类及其对象必须实现 Externalizable 接口
transient修饰为临时属性,参与序列化
读取到文件尾部的标记:java.io.EOFException
使用serialVersionUID 属性保证序列化类和反序列化类是一致的
当实现于Externalizable 接口的时候,必须要实现两个方法,手动进行封装,和提取数据
@Override public void writeExternal(ObjectOutput out) throws IOException { out.writeUTF(name);//进行封装String类型 out.writeInt(age); System.out.println("writeExternal"); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { name = in.readUTF();//读取String类型 age=in.readInt(); System.out.println("readExternal"); }
当在实体类中 在没有序列化之前定义 private static final int serialVersionUID=1320;
直接进行反序列化会报local class incompatible: stream classdesc serialVersionUID = 312312412423423, local class serialVersionUID = 1320
进行序序列化的时候
Student s = new Student("lisi", 12); FileOutputStream fos = new FileOutputStream("D:\\a.bin"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(s); oos.flush();//清空缓存中的数据从内存存入硬盘
进行反序列化的时候
FileInputStream fis = new FileInputStream("D:\\a.bin");
ObjectInputStream oos = new ObjectInputStream(fis);
Student o = (Student)oos.readObject();