Java序列化的实现

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();

 

 

 

 

上一篇:46 对象流


下一篇:实现java跨平台,通用读取文件方法(window/linux系统)