序列化:
将对象按照流的方式存储到文本文件中或者再网络中传输对象---->流数据 序列化流 (ObjectOutputStream)
反序列化:
将文本文件中的流对象或者网络传输中的流对象还原成对象流数据--->对象 反序列化流(ObjectInputStream)
关键字:
transient 修饰属性,这个属性就不会被序列化注意:
1)必须序列化之后才可以反序列化2)自定义类要实现序列化功能,必须实现接口Serializable(标记接口),如果没有实现就会报这个错误NotSerializableException。
public class Person implements Serializable{//产生随机的固定Idprivate static final long serialVersionUID = 3929786557947102117L;transient int age ;//这样这个类的属性就不会被序列化………@Overridepublic String toString() { //为了打印出来不是地址值return "Person [name=" + name + ", age=" + age + "]";}}
3)如果一个类序列化之后,修改了这个类的成员变量,再反序列化,则会报错InvalidClassException,一般情况下这个错误出现的原因:是该类的序列版本号与从流中读取的类描述符的版本号不匹配。
解决办法:让当前实现类序列化功能的这个类产生一个固定ID,类名会有黄色警告线,直接就点它固定Id
程序示例:
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {write() ;read();}// 反序列化
private static void read() throws FileNotFoundException, IOException, ClassNotFoundException {//创建反序列化流对象public ObjectInputStream(InputStream in)ObjectInputStream in = new ObjectInputStream(new FileInputStream("oos.txt")) ;//读public final Object readObject():从 ObjectInputStream 读取对象。Object obj = in.readObject() ;in.close();System.out.println(obj);//Person [name=高圆圆, age=27]
}//序列化
private static void write() throws FileNotFoundException, IOException {//创建一个序列化流对象//public ObjectOutputStream(OutputStream out)ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")) ;//创建一个Person类对象Person p = new Person("高圆圆", 27) ;//public final void writeObject(Object obj)oos.writeObject(p);//关闭资源oos.close();}