serialVersionUID:序列化版本号ID,用来标记序列化的类,如果
不添加serialVersionUID,编译器会默认赋一个值给它
若反序列化对象时类的UID,和序列化对象的类的UID不一样,会报错
解决方法
1.将序列化的类中的UID改成-3151026672****,保证和反序列时的类UID一直
2.将序列化的类改好UID后在反序列化一次,在通过这个生成的新的bin文件来序列化一次
transient:使属性不被序列化
运行结果:
多次序列化 这样多次反序列化就不会异常
s读取的是ligan.bin
s2读取的是sundog.bin
序列化与反序列化注意事项
(1)序列化类必须实现Serializable接口
(2)序列化类中对象属性要求实现Serializable接口
(3)serialVersionUID:序列化版本号ID:保证序列化的类和反序列化的类是同一个类
(4)使用transient(瞬间的)修饰属性,就不能序列化了
(5)静态属性不能序列化
(6)序列化多个对象,可以借助集合实现
使用objectOutputStream实现对象的序列化
要求;序列化的类必须实现Serializable接口
利用集合写入多个对象,利用集合一次性序列化多个对象
一个bin文件被读取之后,下一个读取指令是读取不了这个bin文件的
package com.qian;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
/**
* objectInputStream实现反序列化(读取重构对象)
*注意事项
* (1)序列化类必须实现Serializable接口
* (2)序列化类中对象属性要求实现Serializable接口
* (3)serialVersionUID:序列化版本号ID:保证序列化的类和反序列化的类是同一个类
* (4)使用transient(瞬间的)修饰属性,就不能序列化了
* (5)静态属性不能序列化
* (6)序列化多个对象,可以借助集合实现
*/
public class Demo07
{
public static void main(String[] args) throws Exception {
//1.创建对象流
FileInputStream fis=new FileInputStream("r:\\stu.bin");
ObjectInputStream ois=new ObjectInputStream(fis);
//2.读取文件(反序列化)
Student s=(Student)ois.readObject();//因为ois是 ObjectInputStream类型的,所以要转换
Student s2=(Student)ois.readObject();//因为ois是 ObjectInputStream类型的,所以要转换
//3.关闭
ois.close();
System.out.println("执行完毕");
System.out.println(s.toString());
System.out.println(s2.toString());
}
}
package com.qian;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
/**
* 使用objectOutputStream实现对象的序列化
* 要求;序列化的类必须实现Serializable接口
*/
public class Demo06 {
public static void main(String[] args) throws Exception {
//1.创建对象流
FileOutputStream fos=new FileOutputStream("r:\\stu.bin");//bin表示二进制文件
ObjectOutputStream oos= new ObjectOutputStream(fos);
//2.序列化(写入操作
Student ligan = new Student("李赣",20);
Student sundog=new Student("孙狗", 64);
//利用集合写入多个对象
ArrayList<Student> list=new ArrayList<>();
list.add(ligan);
list.add(sundog);
oos.writeObject(list);//利用ArrayList数组一次性序列化多个对象
// oos.writeObject(ligan);
// oos.writeObject(sundog);
//多次序列化 这样多次反序列化就不会异常
//3.关闭
oos.close();//close内自带flush方法
System.out.println("序列化完毕");
}
}
.writeObject(sundog);
//多次序列化 这样多次反序列化就不会异常
//3.关闭
oos.close();//close内自带flush方法
System.out.println("序列化完毕");
}
}